Q
在運行時調用方法
9
A
回答
7
通常,您使用System.Reflection類來完成此任務。
具體來說,您可以通過Assembly.Load(或Assembly.LoadFrom)加載DLL,然後調用Assembly.GetTypes,然後爲每個類型調用Type.GetMethods。當您有MethodInfo時,您可以撥打MethodInfo.Invoke。
3
您需要使用Reflection。
您可以撥打Assembly.LoadFile
加載包含.Net程序集的.DLL,然後在返回的Assembly
對象上調用GetTypes
方法來查看DLL中的類。
一旦你找到了你感興趣的類的Type
對象,你可以調用它的InvokeMember
方法來調用一個函數。
請注意,反射可能會很慢。
1
,我發現這個在 reflection eamples
// get all public static methods of MyClass type
MethodInfo[] methodInfos = typeof(MyClass).GetMethods(BindingFlags.Public |
BindingFlags.Static);
[C#]
// dynamically load assembly from file Test.dll
Assembly testAssembly = Assembly.LoadFile(@"c:\Test.dll");
[C#]
// get type of class Calculator from just loaded assembly
Type calcType = testAssembly.GetType("Test.Calculator");
[C#]
// create instance of class Calculator
object calcInstance = Activator.CreateInstance(calcType);
[C#]
// get info about property: public double Number
PropertyInfo numberPropertyInfo = calcType.GetProperty("Number");
[C#]
// get value of property: public double Number
double value = (double)numberPropertyInfo.GetValue(calcInstance, null);
[C#]
// set value of property: public double Number
numberPropertyInfo.SetValue(calcInstance, 10.0, null);
[C#]
// get info about static property: public static double Pi
PropertyInfo piPropertyInfo = calcType.GetProperty("Pi");
[C#]
// get value of static property: public static double Pi
double piValue = (double)piPropertyInfo.GetValue(null, null);
[C#]
// invoke public instance method: public void Clear()
calcType.InvokeMember("Clear",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
null, calcInstance, null);
[C#]
// invoke private instance method: private void DoClear()
calcType.InvokeMember("DoClear",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
null, calcInstance, null);
[C#]
// invoke public instance method: public double Add(double number)
double value = (double)calcType.InvokeMember("Add",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
null, calcInstance, new object[] { 20.0 });
[C#]
// invoke public static method: public static double GetPi()
double piValue = (double)calcType.InvokeMember("GetPi",
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
null, null, null);
[C#]
// get value of private field: private double _number
double value = (double)calcType.InvokeMember("_number",
BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic,
null, calcInstance, null);
3
是的,這是可能的,你剛開始加載您的DLL:
Assembly assembly = Assembly.LoadFrom(assemblyPath);
然後調用你的DLL,你會裏面的方法必須使用reflection。
object obj = assembly.CreateInstance(<type.FullName>);
其中type.FullName
是該程序集中某種類型的FullName屬性。通過使用`Delegate.CreateDelegate(...)`,而不是領
MethodInfo methodInfo = obj.GetMethod("MyMethod");
methodInfo.Invoke(obj,null);
相關問題
- 1. 動態方法在運行時調用
- 2. 方法調用時不運行
- 3. 異步運行時方法調用
- 4. 運行時未調用的打印方法,調試時調用
- 5. 無法在Class中調用方法;獲取運行時錯誤
- 6. 在運行時擴展對象時如何調用類方法?
- 7. Toast在調用方法之前運行
- 8. 運行方法內部調用方法時出現NullPointerException
- 9. 如何在調用方法之後和方法調用之前運行方法?
- 10. 在C#運行時使用反射調用ToList()方法#
- 11. 使用在運行時解析的類型調用System.Linq.Queryable方法
- 12. Dealloc在方法仍在運行時調用
- 13. 爲什麼在運行時失敗時會調用StaticallyResolvedTypeParameter方法調用?
- 14. 正在調用應用程序仍在運行時調用UITableViewDelegate dealloc方法
- 15. 如何找到在運行時調用Ruby方法的位置?
- 16. 調度java方法在onbiz的特定時間運行使用
- 17. 在運行時獲取當前調用方法的名稱
- 18. 查看方法在運行時調用java jar文件
- 19. PHP如何在運行時從類中調用方法?
- 20. 調用在運行時編譯的類的自定義方法
- 21. 調用從一個類的方法在運行時
- 22. 如何防止這種方法在運行時經常調用
- 23. 僅在調用時才運行方法(JavaScript)
- 24. JavaFX線程問題 - 在方法調用運行時GUI凍結
- 25. Form_Load事件不會在公共方法調用時運行
- 26. 如何在調用時才運行方法?
- 27. 請在運行時調用關係圖,具體的方法
- 28. 在android apk文件中查看方法調用運行時
- 29. 運行時在SWF中記錄函數調用的方法?
- 30. 在Rails中運行另一種方法之前調用方法
可以提高通過反射調用方法的性能:
一旦你得到了你的情況,你可以調用你的方法是這樣該方法並純粹通過反射來調用它:http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx – 2010-01-31 18:52:10
@Dan:True。但是,這隻有在編譯時知道簽名的情況下才有可能。 – SLaks 2010-01-31 18:53:57
或使用DynamicMethod。 – codekaizen 2010-01-31 19:11:04