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內所有信息