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

相关文章
相关标签/搜索