2009-09-10 7 views
6

Piszę system w C# .net (2.0). Ma moduł typu plug-in. Zespoły można dodawać do systemu bez odbudowywania modułów podstawowych. Aby nawiązać połączenie z nowym modułem, chcę spróbować wywołać metodę statyczną w innym module według nazwy. Nie chcę, aby wywoływany moduł był odwoływany w dowolny sposób w czasie kompilacji.C# wywołać metodę statyczną w czasie wykonywania bez odniesienia do czasu kompilacji?

Powrót, kiedy pisałem niezarządzanego kodu, począwszy od ścieżki do pliku .dll Chciałbym użyć LoadLibrary(), aby uzyskać. Dll w pamięci, a następnie użyj get GetProcAddress() uzyskać wskaźnik do funkcji, którą chciałem wywołać. Jak osiągnąć ten sam wynik w C#/.NET.

Odpowiedz

16

Po zespół jest ładowany przy użyciu Assembly.LoadFrom (...) można uzyskać typu przez nazwę i uzyskać wszelkie metody statycznej:

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, Warto również wspomnieć, że "className" musi zawierać także przestrzeń nazw, np. "MyNamespace.Class1" – icl7126

1

oto próbka:

 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

Kod wywołujący metodę instancji. Poprosiłem o metodę statyczną. Ale w końcu będę potrzebował tego fragmentu. Dzięki. +1 –

Powiązane problemy