2009-09-10 17 views
6

Sto scrivendo un sistema in C# .net (2.0). Ha una sorta di architettura di moduli collegabili. Gli assembly possono essere aggiunti al sistema senza ricostruire i moduli di base. Per stabilire una connessione con il nuovo modulo, desidero provare a chiamare un metodo statico in qualche altro modulo per nome. Non voglio che il modulo chiamato venga referenziato in alcun modo al momento della compilazione.C# chiama un metodo statico in fase di esecuzione senza un riferimento del tempo di compilazione?

Indietro quando stavo scrivendo codice non gestito a partire dal percorso del file .dll avrei usato LoadLibrary() per ottenere la .dll in memoria, quindi utilizzare get GetProcAddress() ottenere un puntatore alla funzione che desideravo chiamare. Come ottengo lo stesso risultato in C#/.NET.

risposta

16

Dopo l'assembly viene caricato utilizzando Assembly.LoadFrom (...), è possibile ottenere il tipo di nome e ottenere qualsiasi metodo statico:

Type t = Type.GetType(className); 

// get the method 
MethodInfo method = t.GetMethod("MyStaticMethod",BindingFlags.Public|BindingFlags.Static); 

Then you call the method: 

method.Invoke(null,null); // assuming it doesn't take parameters 
+2

+ 1, Inoltre vale la pena menzionare che 'className' deve contenere anche namespace, come "MyNamespace.Class1" – icl7126

1

Ecco un esempio:

 string assmSpec = ""; // OS PathName to assembly name... 
     if (!File.Exists(assmSpec)) 
      throw new DataImportException(string.Format(
       "Assembly [{0}] cannot be located.", assmSpec)); 
     // ------------------------------------------- 
     Assembly dA; 
     try { dA = Assembly.LoadFrom(assmSpec); } 
     catch(FileNotFoundException nfX) 
     { throw new DataImportException(string.Format(
      "Assembly [{0}] cannot be located.", assmSpec), 
      nfX); } 
     // ------------------------------------------- 
     // Now here you have to instantiate the class 
     // in the assembly by a string classname 
     IImportData iImp = (IImportData)dA.CreateInstance 
          ([Some string value for class Name]); 
     if (iImp == null) 
      throw new DataImportException(
       string.Format("Unable to instantiate {0} from {1}", 
        dataImporter.ClassName, dataImporter.AssemblyName)); 
     // ------------------------------------------- 
     iImp.Process(); // Here you call method on interface that the class implements 
+0

Code per chiamare un metodo di istanza. Ho chiesto il metodo statico. Ma alla fine avrò bisogno di questo frammento. Grazie. +1 –

Problemi correlati