6 Stimmen

C# eine statische Methode zur Laufzeit aufrufen, ohne eine Referenz zur Erstellungszeit?

Ich schreibe ein System in C# .net (2.0). Es hat eine steckbare Modul Art von Architektur. Assemblies können dem System hinzugefügt werden, ohne die Basismodule neu zu erstellen. Um eine Verbindung mit dem neuen Modul herzustellen, möchte ich versuchen, eine statische Methode in einem anderen Modul namentlich aufzurufen. Ich möchte nicht, dass das aufgerufene Modul zur Build-Zeit in irgendeiner Weise referenziert wird.

Als ich noch nicht verwalteten Code geschrieben habe, habe ich ausgehend vom Pfad zur .dll-Datei LoadLibrary() verwendet, um die .dll-Datei in den Speicher zu laden, und dann mit GetProcAddress() einen Zeiger auf die Funktion erhalten, die ich aufrufen wollte. Wie erreiche ich das gleiche Ergebnis in C# / .NET.

18voto

Philippe Leybaert Punkte 161931

Nachdem die Assembly mit Assembly.LoadFrom(...) geladen wurde, können Sie den Typ anhand des Namens ermitteln und jede statische Methode abrufen:

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 Stimmen

+1, Es ist auch erwähnenswert, dass 'className' auch den Namespace enthalten muss, wie "MyNamespace.Class1"

1voto

Charles Bretana Punkte 137391

Hier ist ein Beispiel:

        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 Stimmen

Code für den Aufruf einer Instanzmethode. Ich bat um eine statische Methode. Aber, ich werde dieses Fragment schließlich benötigen. Vielen Dank. +1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X