C#利用反射機制調用dll

利用反射進行動態加載和調用.
Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路徑加載,同時將此程序集所依賴的程序集加載進來,需後輟名.dll
Assembly.LoadFile 只加載指定文件,並不會自動加載依賴程序集.Assmbly.Load無需後輟名,加載dll後,須要使用dll中某類.
Type type=ass.GetType(「TypeName」);//利用類型的命名空間和名稱得到類型須要實例化類型,才能夠使用,參數能夠人爲的指定,也能夠無參數,靜態實例能夠省略
Object obj = Activator.CreateInstance(type,params[]);//利用指定的參數實例話類型,調用類型中的某個方法:
須要首先獲得此方法
MethodInfo mi=type.GetMethod(「MehtodName」);//經過方法名稱得到方法
而後對方法進行調用,多態性利用參數進行控制
mi.Invoke(obj,params[]);//根據參數直線方法,返回值就是原方法的返回值

 

主要操做步驟以下:
Assembly ass = System.Reflection.Assembly.LoadFile(@"d:\TestReflect.dll");//要絕對路徑
type = ass.GetType("Webtest.ReflectTest");//必須使用名稱空間+類名稱
System.Reflection.MethodInfo method = type.GetMethod("WriteString");//方法的名稱
obj = ass.CreateInstance("Webtest.ReflectTest");//必須使用名稱空間+類名稱
string s = (string)method.Invoke(obj,new string[]{"jianglijun"}); //實例方法的調用

 

實際操做使用,建立一個類庫項目。首先建立一個類:用於作簡單的運算測試測試

namespace dlltest
{
public class Class1
{
decimal x = 0;
decimal y = 0;

public decimal add(decimal x, decimal y)
{
return x + y;
}

public decimal sub(decimal x , decimal y)
{
return x - y;
}

public decimal mul(decimal x, decimal y)
{
return x * y;
}
public decimal div(decimal x, decimal y)
{
return x / y;
}
}
}

 

將上面的程序生成dll 類庫,放到 第二個項目(控制檯程序,這裏只做測試)的debug目錄下。spa

 

///此處略去部分代碼,用於獲取兩個輸入的數字, 可自定義或讀取輸入

Assembly ass = Assembly.Load("dlltest"); //加載dll

Type type = ass.GetType("dlltest.Class1"); //獲取該類 命名空間 + 類名, Class1 是個人類名
MethodInfo mi1 = type.GetMethod("add"); //獲取方法 
MethodInfo mi2 = type.GetMethod("sub");
MethodInfo mi3 = type.GetMethod("mul");
MethodInfo mi4 = type.GetMethod("div");
Object obj = ass.CreateInstance("dlltest.Class1");//必須使用名稱空間+類名稱

//如下是調用該四種方法
decimal rs1 = (decimal)mi1.Invoke(obj, new object [] { x, y }); //obj, new decimal[] {a, b}
decimal rs2 = (decimal)mi2.Invoke(obj, new object[] { x, y });
decimal rs3 = (decimal)mi3.Invoke(obj, new object[] { x, y });
decimal rs4 = (decimal)mi4.Invoke(obj, new object[] { x, y });

Console.WriteLine();
Console.WriteLine("加法結果: " + rs1);
Console.WriteLine("減法結果: " + rs2);
Console.WriteLine("乘法結果: " + rs3);
Console.WriteLine("除法結果: " + rs4);

 

如下是結果顯示:debug

假如不想將dll放到 debug目錄下,能夠獲取 應用程序的主目錄,而後將dl 放到主目錄中。(此處只是一種方法,你能夠不須要複製過來,而直接將目錄指向 dlltest.dll的生成目錄)code

只需以下處理:orm

DirectoryInfo dir = new DirectoryInfo(AppDomain.CurrentDomain.SetupInformation.ApplicationBase).Parent.Parent;
string str = dir.FullName; //獲取或設置包含該應用程序的目錄的名稱
Assembly ass = Assembly.Load(str + "\\" + "dlltest"); //加載dll

//後續操做不變

 

謝謝閱讀!分享共進步blog

相關文章
相關標籤/搜索