从另一个程序集调用方法

Invoke a method from another assembly

我有 Tools.dll 个包含 MyMethod() 的文件,如下所示:

    public void MyMethod()
    {
        global::System.Windows.Forms.MessageBox.Show("Sth");
    }

现在,我正在尝试 运行 来自另一个文件的这个汇编方法:

        System.Reflection.Assembly myDllAssembly = System.Reflection.Assembly.LoadFile(@"PATH\Tools.dll");
 myDllAssembly.GetType().GetMethod("MyMethod").Invoke(myDllAssembly, null); //here we invoke MyMethod.

在运行宁'System.NullReferenceException'之后发生。它说 "Object reference not set to an instance of an object."

那我该如何解决呢?!

我确定这个 .dll 构建没有问题。

注:汇编代码来自:http://www.codeproject.com/Articles/32828/Using-Reflection-to-load-unreferenced-assemblies-a

这个

myDllAssembly.GetType()

是错误的...它将 return typeof(Assembly)

你必须使用 overload

myDllAssembly.GetType("ClassOfMyMethod")

您需要在 GetType(name) call - at the moment, you're calling the standard GetType() that every object implements and so you're getting the Assembly 类型中提供一个名称 - 并且没有 MyMethod 方法。

记住,'Invoke' 需要非静态方法的 class 实例,因此您应该使用这样的构造:

Type type = myDllAssembly.GetType("TypeName");
type.GetMethod("MyMethod").Invoke(Activator.CreateInstance(type), null);

带有参数化构造函数和方法的完整示例

Class代码:

public class MyClass
{
    private string parameter;

    /// <summary>
    /// конструктор
    /// </summary>
    public MyClass(string parameter)
    {
        this.parameter = parameter;
    }

    public void MyMethod(string value)
    {
        Console.Write("You parameter is '{0}' and value is '{1}'", parameter, value);
    }
}

调用代码:

Type type = typeof(MyClass);
// OR
type = assembly.GetType("MyClass");
type.GetMethod("MyMethod").Invoke(Activator.CreateInstance(type, "well"), new object[] { "played" });

结果:

You parameter is 'well' and value is 'played'