2013-04-15 7 views
5

Sto tentando di caricare un assembly durante l'esecuzione e di sottoscrivere i suoi eventi. Nel mio scenario il file dll ha un metodo ADD che ottiene due interi come argomenti e genera un evento con un argomento evento personalizzato che contiene la somma.Iscriviti a un evento di un assembly caricato

Ecco una parte del mio codice per caricare il file 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 }); 

Ma, non ho idea di come iscriversi all'evento sollevata dal montaggio. Qualsiasi aiuto sarebbe apprezzato.

Aggiunto: sorgente di esempio 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; } 
     } 
    } 
} 

risposta

3

basta prendere il ev1 hai già e chiamare AddEventHandler come questo:

ev1.AddEventHandler(obj, MyEventHandlerMethod); 

tuttavia, ti consigliamo di assicurarsi di pulizia da parte del gestore chiamando RemoveEventHandler in modo che si possa verificare la garbage collection.

ev1.RemoveEventHandler(obj, MyEventHandlerMethod); 
+0

Grazie, ancora due domande. in base alla pagina AddEventHandler, ho bisogno di creare un assembly dinamico e un gestore di eventi per avere la stessa firma del delegato nell'assembly caricato. 1) l'esempio non mostra come si possa ottenere il risultato di ritorno da ILGenerator. 2) C'è un modo più semplice per scrivere il metodo MyEventHandler, se conosco la firma in anticipo. Ho aggiunto il codice sorgente per l'esempio Dll alla domanda, se aiuta. – Afshin

Problemi correlati