从另一个程序集调用方法
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'
我有 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'