2013-04-15 17 views
5

Próbuję załadować zespół podczas wykonywania i zasubskrybować jego zdarzenia. W moim scenariuszu plik dll ma metodę ADD, która pobiera dwie liczby całkowite jako argumenty i podnosi zdarzenie z niestandardowym argumentem zdarzenia, który zawiera sumę.Subskrybuj wydarzenie z załadowanym zespołem

Tutaj jest częścią mojego kodu do załadowania pliku 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 }); 

Ale nie mam pojęcia jak do subskrypcji przypadku podniesiony przez zgromadzenie. Każda pomoc będzie doceniona.

Dodano: przykład źródło 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; } 
     } 
    } 
} 

Odpowiedz

3

Wystarczy wziąć ev1 już masz i nazywają AddEventHandler takiego:

ev1.AddEventHandler(obj, MyEventHandlerMethod); 

jednak będziemy chcieli, aby upewnić się, że oczyszczanie przez handler wywoływanie RemoveEventHandler, aby można było przeprowadzić usuwanie śmieci.

ev1.RemoveEventHandler(obj, MyEventHandlerMethod); 
+0

Dzięki, jeszcze dwa pytania. na podstawie strony AddEventHandler, potrzebuję utworzyć dynamiczny moduł obsługi zdarzeń i zdarzeń, aby mieć ten sam podpis co delegat w załadowanym zespole. 1) przykład nie pokazuje, w jaki sposób można uzyskać wynik zwracany przez ILGenerator. 2) Czy istnieje łatwiejszy sposób napisania metody MyEventHandler, jeśli znam podpis z góry. Dodałem kod źródłowy przykładowej biblioteki DLL do pytania, jeśli to pomaga. – Afshin

Powiązane problemy