Problem mit Plugin System

  • VB.NET
  • .NET 4.5

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Problem mit Plugin System

    Hallo ich habe ein kleines Problem, ich habe ein Plugin system mit eigener SDK nach diesem Tut erstellt -> Erstellen eines Plugin-Systems mit VB.NET und MEF ab .NET 3.5. alles geht Prima nun
    habe ich aber folgendes Problem
    ich habe in der SDK (dll Datei) ein Event, das heisst "MeinErstesEvent" nun möchte ich dieses Event in der Hostanwendung behandeln, das heisst ich möchte das wenn mein Plugin das event "raised", das dann etwas in der Hauptanwendung passiert. das Geht aber nicht. Ich bekomme keine Fehler, es Passiert einfach nichts. Hier mal mein code


    Code der SDK

    VB.NET-Quellcode

    1. Imports System.ComponentModel.Composition
    2. Imports System.ComponentModel.Composition.Hosting
    3. Imports System.Windows.Forms
    4. Public Class ZendrikSDK
    5. <ImportMany(GetType(ZendrikPlugin))>
    6. Public plugin As ZendrikPlugin()
    7. Public Sub EnablePlugins()
    8. Dim catalog As New DirectoryCatalog(IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins\"))
    9. Dim container As New CompositionContainer(catalog)
    10. container.ComposeParts(Me)
    11. End Sub
    12. End Class
    13. Public Interface ZendrikPlugin
    14. Sub OnEnable(e As Form)
    15. Class PluginManager
    16. Public Event MeinErstesEvent()
    17. Public Sub LoeseEventAus()
    18. RaiseEvent MeinErstesEvent()
    19. End Sub
    20. End Class
    21. End Interface



    Code Der Hostanwendung (Hauptanwendung)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim verbindung As New MeineSDK.ZendrikSDK
    3. Private WithEvents pm As New MeineSDK.ZendrikPlugin.PluginManager
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. verbindung.EnablePlugins()
    6. For Each plugin As MeineSDK.ZendrikPlugin In verbindung.plugin
    7. plugin.OnEnable(Me)
    8. Next
    9. End Sub
    10. Private Sub BehandleDasEvent() Handles pm.MeinErstesEvent
    11. MsgBox("Das event von der Mainapp wurde durch das plugin ausgelöst")
    12. End Sub





    Hier der Code des Plugins

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Imports MeineSDK
    3. Imports System.ComponentModel.Composition
    4. Imports System.ComponentModel.Composition.Hosting
    5. <Export(GetType(ZendrikPlugin))>
    6. Public Class MeinPlugin
    7. Implements MeineSDK.ZendrikPlugin
    8. Dim mainform As Form
    9. Dim pl As New ZendrikPlugin.PluginbManager
    10. Public Sub OnEnable(e As Form) Implements ZendrikPlugin.OnEnable
    11. RaiseHostAppEvent()
    12. End Sub
    13. Private Sub RaiseHostAppEvent()
    14. pm.LoeseEventAus()
    15. End Sub
    16. End Class



    Könnt ihr mir helfen? wie erstelle ich ein Event in meiner SDK und Behandle das in der Hostanwendung und wie löse ich das Event der SDK im Plugin aus, das in der Anwendung etwas passiert. Bitte helft mir brauche das sehr dringend.
    Wo abonnierst du denn in deiner Anwendung das Event für die Plugins?
    Glaub in VB.Net war das dieses AddHandler/AddressOf Zeug.
    Das hat aber nichts mit deinen Plugins zu tun oder ist das Eventing in Vb.Net anders?

    VB.NET-Quellcode

    1. For Each plugin As MeineSDK.ZendrikPlugin In verbindung.plugin
    2. plugin.OnEnable(Me)
    3. ' ich vermute irgendwie so was hier:
    4. ' AddHandler plugin.MeinErstesEvent, AddressOf BehandleDasEvent
    5. Next

    Danke an slice


    Hier mein Alter Code

    Code der SDK

    VB.NET-Quellcode

    1. Imports System.ComponentModel.Composition
    2. Imports System.ComponentModel.Composition.Hosting
    3. Imports System.Windows.Forms
    4. Public Class MeineSDK
    5. <ImportMany(GetType(VisualBasicPlugin))>
    6. Public plugin As VisualBasicPlugin()
    7. Public Sub EnablePlugins()
    8. Dim catalog As New DirectoryCatalog(IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins\"))
    9. Dim container As New CompositionContainer(catalog)
    10. container.ComposeParts(Me)
    11. End Sub
    12. End Class
    13. Public Interface VisualBasicPlugin
    14. Sub OnEnable(e As Form)
    15. Event test()
    16. End Interface


    Code der Hostanwendung

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim verbindung As New ZendrikSDK.MeineSDK
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. verbindung.EnablePlugins()
    5. For Each plugin As ZendrikSDK.VisualBasicPlugin In verbindung.plugin
    6. plugin.OnEnable(Me)
    7. AddHandler plugin.test, AddressOf MacheWasImHost
    8. Next
    9. End Sub
    10. Private Sub MacheWasImHost()
    11. MsgBox("Das event in der Host wurde von dem Plugin ausgelösert")
    12. End Sub
    13. End Class


    Code des Plugins

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Imports ZendrikSDK
    3. Imports System.ComponentModel.Composition
    4. Imports System.ComponentModel.Composition.Hosting
    5. <Export(GetType(VisualBasicPlugin))>
    6. Public Class MeinPlugin
    7. Implements ZendrikSDK.VisualBasicPlugin
    8. Dim mainform As Form
    9. Public Event test As VisualBasicPlugin.testEventHandler Implements VisualBasicPlugin.test
    10. Public Sub OnEnable(e As Form) Implements VisualBasicPlugin.OnEnable
    11. RaiseEvent test()
    12. MsgBox("Plugin geladen")
    13. End Sub
    14. End Class

    VB.NET-Quellcode



    Vielen Dank slice! Deine Lösung war die richtige, ich hatte einen
    kleinen Fehler in der Addhandler Klausel. Ich sollte evtl den Handler
    erst hinzufügen und dann auslösen.

    hier der Code für alle die das Gleiche Problem haben

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim verbindung As New ZendrikSDK.MeineSDK
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. verbindung.EnablePlugins()
    5. For Each plugin As ZendrikSDK.VisualBasicPlugin In verbindung.plugin
    6. AddHandler plugin.test, AddressOf MacheWasImHost <---- Erst event abonieren
    7. plugin.OnEnable(Me) <--- Dann ausführen.
    8. Next
    9. End Sub
    10. Private Sub MacheWasImHost()
    11. MsgBox("Das event in der Host wurde von dem Plugin ausgelösert")
    12. End Sub
    13. End Class


    Vielen dank slice, hast was gut bei mir.






    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Zendrik“ ()

    Frage zum Pluginsystem

    *Topics zusammengeführt*

    Meine SDK

    VB.NET-Quellcode

    1. Imports System.ComponentModel.Composition
    2. Imports System.ComponentModel.Composition.Hosting
    3. Imports System.Windows.Forms
    4. Public Class MeineSDK
    5. <ImportMany(GetType(VisualBasicPlugin))>
    6. Public plugin As VisualBasicPlugin()
    7. Public Sub EnablePlugins()
    8. Dim catalog As New DirectoryCatalog(IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins\"))
    9. Dim container As New CompositionContainer(catalog)
    10. container.ComposeParts(Me)
    11. End Sub
    12. End Class
    13. Public Interface VisualBasicPlugin
    14. Sub OnEnable(e As Form)
    15. Event test()
    16. End Interface




    Hostanwendung

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim verbindung As New ZendrikSDK.MeineSDK
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. verbindung.EnablePlugins()
    5. For Each plugin As ZendrikSDK.VisualBasicPlugin In verbindung.plugin
    6. plugin.OnEnable(Me)
    7. AddHandler plugin.test, AddressOf MacheWasImHost
    8. Next
    9. End Sub
    10. Private Sub MacheWasImHost()
    11. MsgBox("Das event in der Host wurde von dem Plugin ausgelösert")
    12. End Sub
    13. End Class



    Code des Plugins


    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Imports ZendrikSDK
    3. Imports System.ComponentModel.Composition
    4. Imports System.ComponentModel.Composition.Hosting
    5. <Export(GetType(VisualBasicPlugin))>
    6. Public Class MeinPlugin
    7. Implements ZendrikSDK.VisualBasicPlugin
    8. Dim mainform As Form
    9. Public Event test As VisualBasicPlugin.testEventHandler Implements VisualBasicPlugin.test
    10. Public Sub OnEnable(e As Form) Implements VisualBasicPlugin.OnEnable
    11. RaiseEvent test()
    12. MsgBox("Plugin geladen")
    13. End Sub
    14. End Class






    Nun will ich das test event über ein Sub in der SDK ausführen das man nicht immer RaiseEvent als nutzer machen muss sonder zumbsp MacheWasMitTest() aufrufen muss. Wie bekomme ich das hin?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Zendrik Vielleicht mal ein paar allgemeine Hinweise:
    Normalerweise wird bei einem PlugIn-System ein Interface verwendet, das die Prozeduren usw. deklariert.
    Das Hauptprogramm ruft einfach eine Prozedur in der DLL auf.
    Die DLL generiert ein Event beim Abonenten des Events. Das passiert in VB.NET mit RaisEvent.
    Wenn Du einen anderen Weg gehen willst, verlässt Du das Plugin- und Interface-Prinzip.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Zendrik Welche Veranlassung besteht in Deinem Programm, vom Plugin an das Hauptprogramm Events zu senden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Zendrik Wenn Du einen Player einbindest, sollte der (fast) alle erforderlichen Befehle in seinem SDK bereitstellen.
    Wenn das nicht so ist, wechsle den Player.
    Du solltest System.ComponentModel.Composition eigentlich nicht benötigen müssen.
    Füge die DLL Deinem Projekt als Verweis hinzu und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!