.net中常會用到動態載入DLL,而DLL中可能包含各種參數、方法、窗體,如何來調用動態載入這些參數、方法、窗體呢? 在C#中,我們要使用反射,首先要搞清楚以下命名空間中幾個類的關係: System.Reflection命名空間 (1) AppDomain:應用程式域,可以將其理解為一組程式集的邏輯 ...
.net中常會用到動態載入DLL,而DLL中可能包含各種參數、方法、窗體,如何來調用動態載入這些參數、方法、窗體呢?
在C#中,我們要使用反射,首先要搞清楚以下命名空間中幾個類的關係:
System.Reflection命名空間
(1) AppDomain:應用程式域,可以將其理解為一組程式集的邏輯容器
(2) Assembly:程式集類
(3) Module:模塊類
(4) Type:使用反射得到類型信息的最核心的類
他們之間是一種從屬關係,也就是說,一個AppDomain可以包含N個Assembly,一個Assembly可以包含N個Module,而一個Module可以包含N個Type.
在程式中,如果我們要動態載入一個程式集有以下種方式可以使用,分別是Load、LoadFrom、LoadFile、LoadWithPartialName方法.
其中著重講解以下Assembly.LoadFile 與 Assembly.LoadFrom的區別
1、Assembly.LoadFile只載入相應的dll文件,比如Assembly.LoadFile("abc.dll"),則載入abc.dll,假如abc.dll中引用了def.dll的話,def.dll並不會被載入。
Assembly.LoadFrom則不一樣,它會載入dll文件及其引用的其他dll,比如上面的例子,def.dll也會被載入。
2、用Assembly.LoadFrom載入一個Assembly時,會先檢查前面是否已經載入過相同名字的Assembly,比如abc.dll有兩個版本(版本1在目錄1下,版本2放在目錄2下),程式一開始時載入了版本1,當使用Assembly.LoadFrom("2\\abc.dll")載入版本2時,不能載入,而是返回版本1。Assembly.LoadFile的話則不會做這樣的檢查,比如上面的例子換成Assembly.LoadFile的話,則能正確載入版本2。
LoadFile:載入指定路徑上的程式集文件的內容。
LoadFrom: 根據程式集的文件名載入程式集文件的內容。
調用方法代碼:
舉例需要反射的DLL名稱為WindowsFormsApplication2.dll,其中包含一個From1窗體和一個Class1類,類中有a,b兩個方法,a方法需要傳遞一個Int類型的參數,返回結果為參數+1,b方法不需要傳遞參數,返回結果為1,兩個方法都為靜態方法。
調用b方法,不需要傳遞參數:
Assembly outerAsm = Assembly.LoadFrom(@"urPath\WindowsFormsApplication2.dll"); Type type = outerAsm.GetType("WindowsFormsApplication2.Class1");//調用類型 MethodInfo method = type.GetMethod("b");//調用方法 //不需要傳參數 object obj = string.Empty; string value = method.Invoke(obj, null).ToString(); //value = 1
調用a方法,需要傳遞參數:
Assembly outerAsm = Assembly.LoadFrom(@"urPath\WindowsFormsApplication2.dll"); Type type = outerAsm.GetType("WindowsFormsApplication2.Class1");//調用類型 MethodInfo method = type.GetMethod("a");//調用方法 //如果需要傳參數 object[] paramertors = new object[] { 2016 };//參數集合 string value = method.Invoke(null, paramertors).ToString();//Invoke調用方法 value=2017
調用窗體並載入出來:
Assembly outerAsm = Assembly.LoadFrom(@"urPath\WindowsFormsApplication2.dll"); Type type = outerAsm.GetType("WindowsFormsApplication2.Class1");//調用類型 //調用DLL中窗體 Type outerForm = outerAsm.GetType("WindowsFormsApplication2.Form1", false);//找到指定視窗 (Activator.CreateInstance(outerForm) as Form).Show();//轉換成窗體類,顯示
參考原文鏈接:http://www.cnblogs.com/mumupudding/p/4607400.html