从另一个程序集调用方法

时间:2015-05-07 07:34:57

标签: c# reflection .net-assembly

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

    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'发生 。它表示"对象引用未设置为对象的实例。"

那我怎么解决呢?!

我确定这个.dll建立真理没有问题。

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

3 个答案:

答案 0 :(得分:4)

myDllAssembly.GetType()

错误...它会返回typeof(Assembly)

您必须使用overload

myDllAssembly.GetType("ClassOfMyMethod")

答案 1 :(得分:4)

请记住,'调用'需要一个非静态方法的类实例,因此你应该使用这样的结构:

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

使用参数化构造函数和方法

的完整示例

班级代码:

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);
    }
}

Invokation代码:

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'

答案 2 :(得分:2)

您需要在GetType(name)电话中提供一个名称 - 目前,您正在调用每个对象实施的标准GetType(),因此您获得Assembly类型 - 而且没有MyMethod方法。