Frage

Ich versuche, zusammen ein Plug-ins System mit .NET zu setzen, und ich bin nicht sicher, ob ich es richtig mache. Die Basis des Systems ist, dass ein bestimmtes Verzeichnis ({apppath} / Plugins /) ein Bündel von vorkompilierte DLLs hat, und ich mag durch jeden mit Reflexion suchen, und für jede Klasse zur Verfügung, wenn es eine bestimmte Basisklasse erbt (dies ist in noch einer anderen DLL definiert, aber ich werde in diese später gehen), dann eine Instanz davon erstellen und rufen sie eine bestimmte Funktion in der Instanz.

Public Sub ScanPluginsInDirectory(ByVal Directory As String)

    Dim Plugins As New IO.DirectoryInfo(Directory)
    Dim Files As IO.FileInfo() = Plugins.GetFiles("*.dll")
    Dim CryptType As Type = GetType(CryptPluginBase)
    Dim PluginsData as List(Of LoadedPluginsInfo)

    For Each DllFile As IO.FileInfo In Files
        Try
            Dim thisAsm As Assembly = Assembly.LoadFrom(DllFile.FullName)
            Dim ClassDefs = thisAsm.GetTypes().Where(Function(type) CryptType.IsAssignableFrom(type))

            For Each ClassDef As Type In ClassDefs
                Dim A As Object
                A = ClassDef.Assembly.CreateInstance(ClassDef.Name)
                PluginsData.Add(New LoadedPluginsInfo(A.Plugin(), False))
            Next
        Catch ex As Exception
            Continue For
        End Try
    Next
End Sub

Das spezifische Problem, das ich habe, ist, ich bin nicht sicher, ob dies der richtige Weg ist, dies zu tun. Würde die Methode Ich versuche, Arbeit zu tun, wenn man davon ausgehen kann, dass A.Plugin() tatsächlich existiert und alle Strukturen und Klassen verwiesen hier sind fehlerfrei? Wenn jemand mehr Code benötigen, um würde zu helfen, kann ich es posten.

War es hilfreich?

Lösung

Insgesamt sollte die Strategie arbeiten. Der Anruf wird Assembly.LoadFrom die Zielbaugruppe in den Prozess geladen. Von dort aus ist es möglich, Typ Inspektion und erstellen Instanzen dieser Typen zu tun.

Ich denke, die einfachste und zuverlässigste Weg, um die Instanz zu schaffen, ist die Activator.CreateInstance Methode zu verwenden.

For Each def As Type in ClassDefs
  Dim inst = Activator.CreateInstance(def)
  PluginsData.Add(new LoadedPluginsInfo(inst.Plugin(), False))
Next

Abhängig von Ihren Zielen, wäre ein weiterer Vorschlag, den Try / Catch-Block in die Schleife zu bewegen, anstatt aus ihm heraus. Try / Catch-Block zu haben bedeutet, auf der Außenseite der Schleife, wenn eine gegebene Art in einer Baugruppe einen Fehler hat, können Sie alle Arten von dieser Versammlung verwerfen. Im Interieur es erlaubt Ihnen, nur die Typen zu verwerfen, die nicht funktionieren wie das aktuelle Verhalten expect.d wenn Ihre Absicht sein kann.

Andere Tipps

Das sollte funktionieren, ich habe vor in einigen Projekten dieser Art der Sache im Einsatz. Ich sah speziell für einen Konstruktor und aufgerufen es aber abgesehen davon, dass es die gleiche Idee.

Aber Sie könnten unter MEF , die für eine für Sie kümmern sich um eine Menge Dinge nimmt Plugin-Architektur (wenn Sie bereit sind, ein wenig für die Release-Version zu warten, es ist immer noch CTP jetzt).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top