2010-01-31 84 views
9

我想知道是否有可能在運行時加載.net DLL,查看可用的方法並在運行時執行一個。在運行時調用方法

如果這是可能的,你可以點我在正確的方向

回答

3

您需要使用Reflection

您可以撥打Assembly.LoadFile加載包含.Net程序集的.DLL,然後在返回的Assembly對象上調用GetTypes方法來查看DLL中的類。
一旦你找到了你感興趣的類的Type對象,你可以調用它的InvokeMember方法來調用一個函數。

請注意,反射可能會很慢。

+0

可以提高通過反射調用方法的性能:

一旦你得到了你的情況,你可以調用你的方法是這樣該方法並純粹通過反射來調用它:http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx – 2010-01-31 18:52:10

+1

@Dan:True。但是,這隻有在編譯時知道簽名的情況下才有可能。 – SLaks 2010-01-31 18:53:57

+0

或使用DynamicMethod。 – codekaizen 2010-01-31 19:11:04

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); 
相關問題