我有包含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
答案 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
方法。