Вызов метода во время выполнения

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

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

4 ответа

Решение

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

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

Вам нужно использовать Reflection.

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

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

Да, это возможно, вы просто начинаете с загрузки вашей dll:

Assembly assembly = Assembly.LoadFrom(assemblyPath);

И затем, чтобы вызвать метод внутри вашей dll, вы должны будете использовать отражение.

object obj = assembly.CreateInstance(<type.FullName>);

где type.FullName является свойством FullName некоторого типа в этой сборке.

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

MethodInfo methodInfo = obj.GetMethod("MyMethod");
methodInfo.Invoke(obj,null);

Я нашел это на образцах отражения

 // 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);
Другие вопросы по тегам