以下是我试图从中学习的方案:
Assembly是一个简单的Dll,它带有一个方法,它添加了两个参数,并使用自定义参数引发一个事件,包括sum操作的结果。这是DLL的代码:
namespace Dll1
{
public class Class1
{
public int c = 0;
public void add(int a, int b)
{
c = a + b;
if (Added !=null)
Added(this, new AddArgs(c));
}
public delegate void AddHandler(object sender, AddArgs e);
public event AddHandler Added;
}
public class AddArgs : EventArgs
{
private int intResult;
public AddArgs(int _Value)
{
intResult = _Value;
}
public int Result
{
get { return intResult; }
}
}
}
然后,在我的程序中,我使用Assembly.LoadFile加载了该DLL。我的程序中有另一个名为 EventProcessor 的类,它包含一个事件处理程序来处理来自已加载程序集的事件:
namespace ConsoleApplication1
{
class Program
{
static Type[] parmTypes;
static void Main(string[] args)
{
Assembly asm = Assembly.LoadFile(@"C:\Projects\Dll1.Dll");
Type typ = asm.GetType("DLL1.Class1", true, true);
var method = typ.GetMethod("add");
EventInfo eInfo = typ.GetEvents()[0];
var obj = Activator.CreateInstance(typ);
EventProcessor evProc = new EventProcessor();
Type myTypeObj = evProc.GetType();
MethodInfo myMethodInfo = myTypeObj.GetMethod("myEventHandler");
Delegate d = Delegate.CreateDelegate(myTypeObj, myMethodInfo, true); // Error!
eInfo.AddEventHandler(obj, d);
method.Invoke(obj, new object[] { 1, 0 });
}
}
}
但是,当运行程序时,我收到一条错误消息“类型必须从Delegate派生。 参数名称:类型“。我在这里做错了什么?或者有没有更好的方法来处理这种情况?我还在最后添加了我的事件处理程序类,如果它有帮助。
namespace ConsoleApplication1
{
class EventProcessor
{
public void myEventHandler(object sender, AddArgs args)
{
Console.WriteLine("Event Received.");
}
}
public class AddArgs : EventArgs
{
private int intResult;
public AddArgs(int _Value)
{
intResult = _Value;
}
public int Result
{
get { return intResult; }
}
}
}
提前致谢。
答案 0 :(得分:1)
您的问题是ConsoleApplication1没有对Dll1的引用。即使您将两个程序集中的AddArgs
结构相同,它们仍然是不同的类型,不能互换使用。
此解决方案是使用程序集ConsoleApplication1
和Dll1
都知道的类型。两个程序集必须使用相同的类型。
您还使用了用于静态事件方法的CreateDelegate
方法的覆盖。由于您正在尝试连接实例方法,因此您还必须提供目标。