gpt4 book ai didi

C# 反射 - 加载程序集并调用方法(如果存在)

转载 作者:IT王子 更新时间:2023-10-29 04:16:32 32 4
gpt4 key购买 nike

我想加载一个程序集(它的名称存储在一个字符串中),使用反射检查它是否有一个名为“CustomType MyMethod(byte[] a, int b)”的方法并调用它,否则抛出异常.我想我应该做这样的事情,但如果有人能就如何最好地做到这一点提供相同的建议,我将不胜感激:

Assembly asm = Assembly.Load("myAssembly"); /* 1. does it matter if write myAssembly or myAssembly.dll? */

Type t = asm.GetType("myAssembly.ClassName");

// specify parameters
byte[] a = GetParamA();
int b = GetParamB();

object[] params = new object[2];
params[0] = a;
params[1] = b;

/* 2. invoke method MyMethod() which returns object "CustomType" - how do I check if it exists? */
/* 3. what's the meaning of 4th parameter (t in this case); MSDN says this is "the Object on which to invoke the specified member", but isn't this already accounted for by using t.InvokeMember()? */
CustomType result = t.InvokeMember("MyMethod", BindingFlags.InvokeMethod, null, t, params);

这是否足够好,或者是否有更好/更快/更短的方法?考虑到这些方法不是静态的,那么构造函数呢?可以简单地忽略它们吗?

当调用 void Methods() 时,是只写 t.InvokeMember(...) 还是应该总是写 Object obj = t.InvokeMember(...)?

提前致谢。


编辑我在下面提供了一个工作示例作为单独的答案。

最佳答案

由于这似乎是一个很受欢迎的问题,这里是完整的源代码示例,说明如何做到这一点。

假设我们有一个示例程序集,MyAssembly.dll,它有一个类 MyClass。我们希望动态加载它并调用它的方法。 MyAssembly 代码:

namespace MyAssembly
{
public class MyClass
{
public int X { get; set; }
public int Y { get; set; }

public MyClass(int initialX, int initialY)
{
X = initialX;
Y = initialY;
}

public int MyMethod(int count, string text)
{
Console.WriteLine("This is a normal method.");
Console.WriteLine("Count: {0}", count);
Console.WriteLine("Text: {0}", text);

return this.X + this.Y;
}

public static void StaticMethod(int count, float radius)
{
Console.WriteLine("This is a static method call.");
Console.WriteLine("Count: {0}", count);
Console.WriteLine("Radius: {0}", radius);
}
}
}

首先,我们想使用构造函数 MyClass(int initialX, int initialY) 创建类的实例,然后调用方法 public int MyMethod(int count, string text )。以下是您如何从另一个项目(例如控制台应用程序)执行此操作:

static void Main(string[] args)
{
//
// 1. Load assembly "MyAssembly.dll" from file path. Specify that we will be using class MyAssembly.MyClass
//
Assembly asm = Assembly.LoadFrom(@"C:\Path\MyAssembly.dll");
Type t = asm.GetType("MyAssembly.MyClass");

//
// 2. We will be invoking a method: 'public int MyMethod(int count, string text)'
//
var methodInfo = t.GetMethod("MyMethod", new Type[] { typeof(int), typeof(string) });
if (methodInfo == null)
{
// never throw generic Exception - replace this with some other exception type
throw new Exception("No such method exists.");
}

//
// 3. Define parameters for class constructor 'MyClass(int initialX, int initialY)'
//
object[] constructorParameters = new object[2];
constructorParameters[0] = 999; // First parameter.
constructorParameters[1] = 2; // Second parameter.

//
// 4. Create instance of MyClass.
//
var o = Activator.CreateInstance(t, constructorParameters);

//
// 5. Specify parameters for the method we will be invoking: 'int MyMethod(int count, string text)'
//
object[] parameters = new object[2];
parameters[0] = 124; // 'count' parameter
parameters[1] = "Some text."; // 'text' parameter

//
// 6. Invoke method 'int MyMethod(int count, string text)'
//
var r = methodInfo.Invoke(o, parameters);
Console.WriteLine(r);
}

调用静态方法 public static void StaticMethod(int count, float radius) 如下所示:

var methodInfoStatic = t.GetMethod("StaticMethod");
if (methodInfoStatic == null)
{
// never throw generic Exception - replace this with some other exception type
throw new Exception("No such static method exists.");
}

// Specify parameters for static method: 'public static void MyMethod(int count, float radius)'
object[] staticParameters = new object[2];
staticParameters[0] = 10;
staticParameters[1] = 3.14159f;

// Invoke static method
methodInfoStatic.Invoke(o, staticParameters);

关于C# 反射 - 加载程序集并调用方法(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14479074/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com