9

我想知道是否可以在运行时加载 .net DLL,查看可用的方法并在运行时执行一个。

如果这是可能的,你能指出我正确的方向吗

4

4 回答 4

7

通常,您使用 System.Reflection 类来完成此任务。

具体来说,您将通过Assembly.Load(或Assembly.LoadFrom)加载 DLL,然后调用Assembly.GetTypes,然后为每种类型调用Type.GetMethods。当你有一个MethodInfo时,你可以调用MethodInfo.Invoke

于 2010-01-31T18:46:51.720 回答
3

您需要使用反射

您可以调用Assembly.LoadFile以加载包含 .Net 程序集的 .DLL,然后GetTypes在返回的Assembly对象上调用该方法以查看 DLL 中的类。
一旦你Type为你感兴趣的类找到了一个对象,你就可以调用它的InvokeMember方法来调用一个函数。

请注意,反射可能会很慢。

于 2010-01-31T18:46:39.257 回答
3

是的,这是可能的,您只需从加载 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);
于 2010-01-31T18:54:44.000 回答
1

我在 反射示例中找到了这个

 // 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);
于 2010-01-31T18:54:32.187 回答