Interface prüfen

  • VB.NET
  • .NET 3.5

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Rikudo.

    Interface prüfen

    Hallo,

    Ich arbeite noch an gerade an eiem Pluginsystem und versuche zu Prüfen ob die Pluginklasse ein Interface namens "PluginConnector.Connector" implementiert.
    Mein Ansatz:

    VB.NET-Quellcode

    1. Private Function LoadPlugins() As Boolean
    2. Dim PluginDirectory As String = Application.StartupPath & "\Plugins"
    3. Dim PluginAssembly As Assembly
    4. If Directory.Exists(PluginDirectory) Then
    5. For Each File As String In Directory.GetFiles(PluginDirectory, "*.dll")
    6. Try
    7. PluginAssembly = Assembly.LoadFile(File)
    8. Catch ex As Exception
    9. Continue For
    10. End Try
    11. For Each MyType As Type In PluginAssembly.GetTypes
    12. Dim intf As Type() = MyType .GetInterfaces()
    13. For i As Integer = 0 To intf.Length - 1
    14. If intf(i) Is GetType(PluginConnector.Connector) Then
    15. 'It is a valid Plugin?
    16. MsgBox(File, MsgBoxStyle.Information, "Valid Plugin")
    17. Else
    18. MsgBox(File, MsgBoxStyle.Critical, "Invalid Plugin")
    19. Return True
    20. End If
    21. Next
    22. Return False
    23. Next
    24. Next
    25. End If
    26. Return True
    27. End Function



    Problem: Er zeigt mir keine MsgBox, wenn der Code auf ein echtes Plugin stößt, während es die Dateien in dem Ordner "Plugins" durchgeht.
    Warum?
    C# Developer
    Learning C++
    Trotzdem. Der Sinn ist nicht ein fertiges Pluginsystem zu verwenden sondern das eigene zu erstellen. Nun muss ich prüfen ob eine Datei auch ein echtes Plugins ist indem ich eben prüfen muss ob PluginConnector.Connector in der Klasse des Plugins implementiert ist. Nur irgendwie will das nicht so ganz
    C# Developer
    Learning C++
    Hallo Zusammen,

    @Rikudo

    der einfachheit halber würde ich in Zeile 13 - Code im Eröffnungsport - lieber ein For Each verwenden.

    Gruss

    mikeb69

    Artentus schrieb:

    So solltest du am einfachsten auf ein Interface abfragen können:

    VB.NET-Quellcode

    1. ​If GetType(Connector).IsAsignableFrom(GetType(myType)) Then

    Connector sollte übrigens IConnector heißen.


    Ich verstehe nicht ganz wie ich das in meinen Ansatz-Code einbauen würde...
    C# Developer
    Learning C++
    Es wäre einfach alles in der inneren ForEach-Schleife durch diese Abfrage zu ersetzt.
    Der Sinn deiner Funktion ist mir aber ohnehin schleierhaft. Du möchtest doch alle Plugins laden, dein Code da lädt aber wenn überhaupt nur das erste, als Rückgabetyp möchtest du doch sowas wie List(Of IConnector). Bedenke auch, dass in einer Assembly theoretisch mehrere Plugins sein können.
    Hi
    ich hätte ein paar Alternativen:
    1. Verwende ein Attribut, das angibt, dass es sich um ein Plug-In handelt.
    2. Verwende ein auf der Assembly spezifiziertes Attribut, das angibt, welcher Typ Plug-Ins bereitstellt.
    3. Verwende ein Attribut, das einen Plug-In-Basistypen und einen Plug-In-Instanz-Typen bereitstellt. Der Basistyp gibt an, welche Funktionalität durch das Plug-In ergänzt wird, der Plug-In-Instanz-Typ, von welchem Typ eine Instanz erzeugt werden soll, also das konkrete Plug-In.

    Gruß
    ~blaze~
    @Rikudo

    unabhängig davon was meine Nachposter geschrieben haben hier eine entsprechende For Each

    VB.NET-Quellcode

    1. For Each t As Type In MyType .GetInterfaces()


    Das hier

    Visual Basic-Quellcode

    1. For i As Integer = 0 To intf.Length - 1
    2. ...
    3. MsgBox(File, MsgBoxStyle.Information, "Valid Plugin")

    ist typisches VB6 programmieren.

    Gruss

    mikeb69
    @mikeb69 Jau :thumbup:
    Was es da noch zu sagen gibt, wenn Du Dir zum Beispiel die Interfaces der Klasse holen willst, dann nutze mikeb's Code, nur, dass Du eben noch den 'Type' angibst, denn der wird da ja als Datentyp erwartet. Das machst Du mit bla.GetType(), diese Funktion gibt einen entsprechenden 'Type' zurück.

    Und wie gesagt, MessageBox.Show nutzen!
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: