2010-01-31 5 views
9

Мне интересно, можно ли загружать DLL .net во время выполнения, просматривать доступные методы и выполнять их во время выполнения.метод вызова во время выполнения

Если это возможно, могли бы вы мне точку в правильном направлении

ответ

7

Как правило, для выполнения этой задачи используются классы System.Reflection.

В частности, вы бы загрузить DLL с помощью Assembly.Load (или Assembly.LoadFrom), а затем вызвать Assembly.GetTypes, а затем для каждого типа вызова Type.GetMethods. Когда у вас есть MethodInfo, вы можете позвонить ему MethodInfo.Invoke.

3

Вы должны использовать Reflection.

Вы можете позвонить Assembly.LoadFile загрузить .DLL, содержащий сборку .Net, а затем вызвать метод GetTypes на возвращаемом Assembly объекта, чтобы посмотреть на классы в DLL.
Как только вы нашли объект Type для интересующего вас класса, вы можете вызвать его метод InvokeMember для вызова функции.

Остерегайтесь того, что отражение может быть довольно медленным.

+0

Вы можете улучшить производительность вызова метода с помощью отражения с помощью 'Delegate.CreateDelegate (...)' вместо того, чтобы метод и называя его чисто отражением: http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx –

+1

@Dan: True. Однако это возможно только в том случае, если вы знаете подпись во время компиляции. – SLaks

+0

или используйте DynamicMethod. – codekaizen

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 какого-либо типа в этой сборке.

После того, как вы получили свой экземпляр, вы можете вызвать свой метод так:

MethodInfo methodInfo = obj.GetMethod("MyMethod"); 
methodInfo.Invoke(obj,null); 
Смежные вопросы