2013-04-15 37 views
5

我想在运行时加载程序集并订阅其事件。在我的场景中,dll文件具有一个ADD方法,该方法获取两个整数作为参数,并用包含总和的自定义事件参数引发一个事件。订阅装入程序集的事件

这里是我的代码的一部分来加载DLL文件:

Assembly asm = Assembly.LoadFile(@"C:\Projects\Dll1.Dll"); 
Type typ = asm.GetType("DLL1.Class1", true, true); 

var method = typ.GetMethod("add"); 
var obj = Activator.CreateInstance(typ); 

EventInfo ev1 = typ.GetEvents()[0]; // just to check if I have the proper event 
Type tDelegate = ev1.EventHandlerType; // just to check if I have the proper delegate 

method.Invoke(obj, new object[] { 1, 0 }); 

但是,我不知道如何订阅由大会提出的事件。任何帮助,将不胜感激。

补充:例如DLL源

namespace Dll1 
{ 
    public class Class1 
    { 
     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; } 
     } 
    } 
} 

回答

3

只取ev1你已经有了,并呼吁AddEventHandler这样的:

ev1.AddEventHandler(obj, MyEventHandlerMethod); 
但是

,你要确保你清理处理程序通过调用RemoveEventHandler以便可以发生垃圾回收。

ev1.RemoveEventHandler(obj, MyEventHandlerMethod); 
+0

谢谢,但还有两个问题。基于AddEventHandler页面,我需要创建一个动态程序集和事件处理程序,以便与加载程序集中的委托具有相同的签名。 1)该示例没有显示如何获得ILGenerator的返回结果。 2)如果我事先知道签名,是否有更简单的方法来编写MyEventHandler方法?如果有帮助,我已将示例Dll的源代码添加到问题中。 – Afshin