C#反射調用外部Dll,執行其中異步函數並取返回值


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM