Plugin System Help

  • Allgemein

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

    Plugin System Help

    Hallo alle zusammen, ich brauche hilfe, ich habe vor ein plugin system in mein programm einzubauen, das programm spielt dabei erst einmal keine rolle.
    Das plugin system ist ersteinmal simple aufgebaut, das haupt programm lädt .dll dateien (die plugins) und übermittelt zusätzlich (wenn notwendig) parameter..

    Bis dahin geht alles klar, nur das problem ist wie das plugin wieder Resultate zurück sendet..

    Ein beispiel :

    Ich lade ein plugin das alle dateien in der C festplatte mit der .jpg endung sucht, wenn fertig sendet es das resultat an das "hauptprogramm" weiter, wie könnte ich das am besten machen?

    Danke.

    marcelcoder schrieb:

    Ich lade ein plugin das alle dateien in der C festplatte mit der .jpg endung sucht
    Was sucht solch Minimalcode in einem PlugIn?
    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).
    Programmierfragen über PN / Konversation werden ignoriert!

    timmi31061 schrieb:

    Moin,

    mach dir einfach ein Event, das du, wenn Daten verfügbar sind auslöst.
    Hi, daran hab ich auch schon gedacht.. aber wie sollte das funktionieren? Wie soll dieses plugin ein event der hauptform raisen? Ich weiß wie es ein eigenes event raised aber ich habe keine ahnung wie ich das der hauptform raise kann...

    Geht es, das event als parameter zum plugin zu übertragen und das plugin raised das event dann wenn es fertig ist?

    Kannst du vllt einen beispiel code hier zeigen? Danke..

    marcelcoder schrieb:

    Hi, ich hab leider keine ahnung wie man das programmieren könnte

    RodFromGermany schrieb:

    Was sucht solch Minimalcode in einem PlugIn?
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    lade die Plug-Ins und setze einen Interface-Typen oder eine abstrakte Klasse voraus. Anschließend arbeitest du rein auf dem Basistyps (Plug-In instanzieren und eben in den Basistyp casten). Damit kannst du so damit umgehen, als wäre da kein Unterschied. GUI und Daten sind hierbei wieder zu trennen ==> du übergibst nur die Listen, Objekte, etc. und die Darstellung übernimmt die GUI. Hierbei verwendest du bewusst geeignete Strukturen, die die Aktionen so modellieren, dass sie GUI-unabhängig sind, das gehört besonders bei Plug-In-Systemen dazu.

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    Hi
    lade die Plug-Ins und setze einen Interface-Typen oder eine abstrakte Klasse voraus. Anschließend arbeitest du rein auf dem Basistyps (Plug-In instanzieren und eben in den Basistyp casten). Damit kannst du so damit umgehen, als wäre da kein Unterschied. GUI und Daten sind hierbei wieder zu trennen ==> du übergibst nur die Listen, Objekte, etc. und die Darstellung übernimmt die GUI. Hierbei verwendest du bewusst geeignete Strukturen, die die Aktionen so modellieren, dass sie GUI-unabhängig sind, das gehört besonders bei Plug-In-Systemen dazu.

    ~blaze~ schrieb:

    Gruß
    ~blaze~
    Hey, kannst du mir ein code sample zeigen? Ich binn mir nicht sicher wie das funktionieren sollte.. Ich hab schon ein interface sample gesehen wo das plugin mit einer textbox von der hauptform geladen wird, und dann das plugin einfach den textbox text setzt oder halt bekommt, aber ich weiß nicht wie man resultate an die hauptform sendet..

    Wäre nett, wenn jmd code samples hätte?
    Programmiere unabhängig von der GUI. Die GUI stellt nur Daten dar ==> Datenbindung und Events. Kommt drauf an, z.B. eine Liste an eine ListBox binden und die Liste nach außen hin zur Verarbeitung freigeben (z.B. in einer Klasse kapseln und diese als Interface-Parameter angeben). Ansonsten:

    VB.NET-Quellcode

    1. Public Interface ICanDoSomeStuff
    2. Function DoStuff(values As SomeDescription) As IEnumerable(Of SomeDescription)
    3. End Interface
    4. Public MustInherit Class SomeDescription
    5. Public MustOverride Sub Foo()
    6. Public Overridable ReadOnly Property CanICreateSomeOtherStuff As Boolean
    7. Get
    8. Return False
    9. End Get
    10. End Property
    11. Public Function CreateSomeOtherStuff() As SomeDescription
    12. Throw New NotSupportedException()
    13. End Function
    14. End Class

    Diese instanzierst du dann über den Typen und Activator.CreateInstance und arbeitest damit weiter:

    VB.NET-Quellcode

    1. Dim tp As Type = myConcreteType
    2. Dim instance As ICanDoSomeStuff = DirectCast(Activator.CreateInstance(tp), ICanDoSomeStuff)
    3. For Each bla In instance.DoSomeStuff(...


    Angepasst an deine Architektur können die Funktionsparameter eben irgendwas sein und du kannst vernünftig damit umgehen.

    Gruß
    ~blaze~
    Erstmal danke für die hilfe, aber mir scheint das alles so complex und zu kompliziert, ich will eigentlich nur das das plugin der hauptform ne array mit objecten sendet die data enthält

    Am einfachsten wäre es, wenn das plugin einfach eine methode der hauptform aufrufen und nen parameter übertragen, geht das nicht so einfach?
    Sowas macht man nicht. Wenn du so eine Funktionalität, wie ein Plug-In-System einbauen möchtest, musst du dich auch mit der Architektur dahinter beschäftigen. Ich baue ja auch kein Haus, wenn ich weiß, wie ich zwei Ziegel aufeinanderstaple. Und Code ist bekanntlich größtenteils nicht in der Hauptform angesiedelt, sondern in anderen Typen. Das schreibt die Trennung in Zugehörigkeiten bereits vor. Wenn ich in einem Haus sitze modelliere ich mir ja auch keine Hundehütte für meinen hypothetischen Hund rein, die ist schön davon getrennt in eine eigene Klasse, wie das Haus selber auch . Der Baugrund (entspricht Anwendung) kennt entsprechend Haus (=> Hauptfenster) und Hundehütte (=> eines der Plug-Ins, die nicht zur Hauptanwendung gehören). Jede Komponente davon ist in sich geschlossen und gewisse Interaktionen können durchgeführt werden, auch wenn es keine direkte Beziehung zwischen Haus und Hundehütte geben dürfte (fällt mir jetzt zumindest keine ein).

    Gruß
    ~blaze~

    marcelcoder schrieb:

    ich will eigentlich nur das das plugin der hauptform ne array mit objecten sendet die data enthält
    Ich glaub, jetzt hab ich Dich verstanden.
    Vielleicht machst Du es so:
    Kapsele die PlugIns in eineer eigenen Klasse, die synchron arbeitet: Du rufst die Prozedur auf und sendest, wenn sie zurück ist, Dein Event an Dein Hauptprogramm mit Deinen Prametern.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nicht das Event der Hauptform! Das Event der Pluginklasse!

    Es wäre sinnvoller, Methoden bzw. Funktionen die Daten einsammeln und zurückgeben zu definieren, wenn nichts asyncron läuft.

    Pseudocode!

    VB.NET-Quellcode

    1. Class Plugin
    2. Public Event HalloWelt(ByVal Daten As String)
    3. Private Sub DasIstAsyncron()
    4. RaiseEvent HalloWelt("Ein Event!")
    5. End Sub
    6. End Class
    7. Class Hauptform
    8. Private x As Plugin
    9. Public Sub New()
    10. x = New Plugin()
    11. AddHandler x.HalloWelt, MeinHandler
    12. End Sub
    13. Private Sub MeinHandler(ByVal Daten As String)
    14. MessageBox.Show(Daten)
    15. End Sub()
    16. End Class
    Mit freundlichen Grüßen,
    Thunderbolt