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

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

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

9
задан fishhead 1 February 2010 в 00:39
поделиться

4 ответа

Обычно для этой задачи используются классы System.Reflection.

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

7
ответ дан 4 December 2019 в 14:28
поделиться

Необходимо использовать Reflection .

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

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

3
ответ дан 4 December 2019 в 14:28
поделиться

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

Assembly assembly = Assembly.LoadFrom(assemblyPath);

, а затем вызовут метод внутри вашей DLL, вам придется использовать Отражение .

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

Где Тип. Type.fullname - это свойство полного типа в этой сборке.

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

MethodInfo methodInfo = obj.GetMethod("MyMethod");
methodInfo.Invoke(obj,null);
3
ответ дан 4 December 2019 в 14:28
поделиться

Я нашел это в Отражение Омплы

 // 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);
1
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: