using System.Reflection;
1.载入Dll
Assembly asm=Assembly.LoadFile(FullPath);//FullPath 为Dll所在位置的全路径。
2.取得所需要的类的类型
Type t = asm.GetType("namespaceName.className");//命名空间名.类名
3.建立此类型的对象(相当于 new)
object o = Activator.CreateInstance(t); //创建Type t类型的对象
4.取得类中想要执行的方法
MethodInfo me = t.GetMethod("TestFunction");
5.取得此方法所需参数列表
ParameterInfo[] para=me.GetParameters();
6.创建参数类型的对象,并传入参数Array
Type re = asm.GetType("TestDll.ReturnClass"); //我的参数类型是TestDll命名空间下 ReturnClass类 object reo = Activator.CreateInstance(re); object[] r = { reo };
7.调用函数
Object rr = me.Invoke(o, r); //如果调用的是非异步函数,此时object rr就是函数的返回值。
8.如果调用的是异步函数
Task task = me.Invoke(o, r) as Task; await task; object result = task.GetType().GetProperty("Result").GetValue(task, null); //result就是异步函数的返回值
9.反射常用操作
//取得o实例中propertyName属性的值value
Type t = asm.GetType("TestDll.TestClass"); object o = Activator.CreateInstance(t); object getproperty = t.GetProperty("propertyName").GetValue(o, null); //方法一 object getproperty1 = o.GetType().GetProperty("propertyName").GetValue(o, null); //方法二
//取得枚举类型中的指定元素
Type enumType = asm.GetType("namespaceName.enumName");
foreach(var name in Enum.GetValues(enumType))
{
if("elementname"==name.ToString())
{
Convert.ToInt32(name);//转化制定元素为int
}
}
string[] strname=Enum.GetNames(enumType);//取得枚举所有元素名
10.总结
大概就是,在你不知道Dll的内部结构的情况下,可以通过反射获得Dll内所有信息