2013-04-15 6 views
5

実行時にアセンブリをロードし、そのイベントをサブスクライブしようとしています。私のシナリオでは、DLLファイルには引数として2つの整数を取得し、合計を含むカスタムイベント引数でイベントを発生させるADDメソッドがあります。私はアセンブリによって発生するイベントをサブスクライブする方法が分からない、ロードされたアセンブリのイベントを購読します

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ファイルをロードするために私のコードの一部です。どんな助けもありがとう。

を追加しました:しかし、あなたがでハンドラを必ずクリーンアップしたいでしょう

ev1.AddEventHandler(obj, MyEventHandlerMethod); 

:例の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を呼び出すを取りますガベージコレクションが発生するようにRemoveEventHandlerを呼び出します。

ev1.RemoveEventHandler(obj, MyEventHandlerMethod); 
+0

ありがとうございます。 AddEventHandlerページに基づいて、ロードされたアセンブリのデリゲートと同じシグネチャを持つための動的アセンブリとイベントハンドラを作成する必要があります。 1)ILGeneratorが返す結果をどのように得ることができるかを示す例はありません。 2)私が事前に署名を知っていれば、MyEventHandlerメソッドを記述するための簡単な方法はありますか?私はそれが役立つ場合、質問に例のDLLのソースコードを追加しました。 – Afshin

関連する問題