PluginLib [2.1]

    • Release

    Es gibt 125 Antworten in diesem Thema. Der letzte Beitrag () ist von ClonkAndre.

      Hi.
      Achja :D
      Irgendwie habe ich komplett vergessen, dass man das auch gebrauchen könnte. Das war eigentlich nur zur Datenweitergabe gedacht. Aber wenn du es schon sagst, werde ich es gleich mal einbauen ;)

      EDIT: Fertig + getestet

      Gruß
      To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

      At some point in time, you recognize that knowing more does not necessarily make you more happy.

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

      Das ist der Code:

      VB.NET-Quellcode

      1. Dim plugin As New PluginLib.PluginLib("INIEdit.Export.KeyValue", "ExportKeyValue")
      2. plugin.LoadPlugin("INIEdit.Export.KeyValue.dll")


      Das Projekt heißt: INIEdit.Export.KeyValue
      Die Datei heißt: INIEdit.Export.KeyValue.dll
      Die Klasse heißt: ExportKeyValue
      Hi.
      Ohne dir die Lauen vermiesen zu wollen - bist du sicher, dass es möglich ist, Projektnamen mit Punkten zu versehen? Probiere es mal testweise mit Unterstrichen. Falls es daran lag, werde ich mir was einfallen lassen, um auch Punkte zu ermöglichen ;)

      Gruß
      To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

      At some point in time, you recognize that knowing more does not necessarily make you more happy.
      Ja.
      Sonst wäre das ganze ja sinnlos. Das ist bei einem Pluginsystem Voraussetzung, um es Modular zu halten.

      Gruß
      To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

      At some point in time, you recognize that knowing more does not necessarily make you more happy.
      Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

      OK. Und wieso braucht man bei deinem Plugin-System "System.Collections.Generic.KeyValuePair". Ich hab mir das Beispielprojekt mal angeschaut und ich finde es unübersichtlich.

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

      Brauchen tust du das nur, wenn du alle Plugins durchgehst. Und wo ist das Problem? KeyValuePair ist der stinknormale Iteratortyp für System.Collections.Generic.Dictionary. Das heißt, du kannst auf Objekte mit ( und ) zugreifen.
      Beispiel:

      VB.NET-Quellcode

      1. Dim X As Dictionary(Of String, PluginLib.Plugin) = PluginManager.GetPlugins()
      2. For Each Y As KeyValuePair(Of String, PluginLib.Plugin) In X
      3. ' Pluginname = Y.Key
      4. ' Plugin-Klasseninstanz = Y.Value
      5. Next


      Dictionary ist das gleiche wie List bzw. ArrayList nur halt mit einem Schlüssel (also es wird ein beliebiger Typ als Schlüssel verwendet und kein Index als Integer).

      Gruß
      To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

      At some point in time, you recognize that knowing more does not necessarily make you more happy.
      @Chrisber:
      Ich hab die Lib noch nicht getestet, bin aber daran interessiert.
      Zugegeben hab ich zu viel mit TKMap zu tun. Allein ist das einfach viel viel Arbeit.

      Eine Hauptkomponente wird das Pluginsystem. Das ist eines der wenigen aber wichtigen Dinge
      die TKMap so besonders machen sollen.

      Die Plugins sollen am Start geladen werden (per Interface geerbeter Aufruf) und im Programm
      sollen dann MenuItems usw. freiräumig platziert werden können (von den Plugins selbst), sowie
      das handlen von deren Events.


      Wie siehts mit der Lib aus? Schafft die das?

      Da wären halt dann noch Sachen mit dem ganzen rechtlichen. Denn TKMap wird geplant in Lite (kostenlos) und Professional (kostenpflichtig)
      erhältlich sein. 2-tere soll Pluginfähig sein.
      Mich würde halt dann interessieren ob du was dafür verlangst, und wenn was. Ein Eintrag im About-Dialog ist dabei, sowie die DLL wird nicht
      einkompiliert.


      MfG
      R
      Hi.
      Bist du der, der mir eine E-Mail geschrieben hat? Wenn ja, sorry, aber irgendwie kann ich keine Mails über Outlook senden ^^
      Also ich habe kein Problem damit, kannst du gerne machen ;)

      Schaffen tut die PluginLib das problemlos. Ich würde eine Funktion in die Plugins implementieren, die einfach die komplette Form als Referenz annimmt. So kann die DLL praktisch machen, was sie will (falls das nicht gewünscht ist, kann man ja auch einfach nur z.B. die Menüleiste als Referenz übergeben). Mal ein ungetestetes Beispiel, welches eher Pseudo- als funktionierender Code ist.

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Public Function ApplyInterfaceChanges(ByReference pForm As Form) As Boolean
      2. ' Beispiel: Rückgabe "True" wenn die DLL was verändert, sonst "False"
      3. ' Alle Controls durchlaufen und nach dem Control mit dem Namen "MenuObject" suchen
      4. For Each pControl In pForm.Controls
      5. ' Ist das gesuchte Control unser Hauptmenü?
      6. If pControl.ToString().Contains("MenuObject") Then
      7. ' Von "Object" zu "MenuStrip" casten, um es richtig verwenden zu können
      8. Dim menuObject As MenuStrip = DirectCast(pControl, MenuStrip)
      9. ' Neuen Eintrag erstellen
      10. Dim myEntry As ToolStripItem = New ToolStripItem()
      11. myEntry.Text = "Testeintrag"
      12. ' Dem Hauptmenü hinzufügen
      13. menuObject.Items.Add(myEntry)
      14. ' Da gefunden wurde, beenden und "True" zurückgeben
      15. Return True
      16. End If
      17. Next
      18. ' Kein Hauptmenü, also "False"
      19. Return False
      20. End Function


      Mit den entsprechenden Funktionen der PluginLib rufst du diese Funktion in den DLLs dann an einem geeignetem Punkt (z.B. im Load-Event der Form) auf. Da du eine Referenz verwendet, musst du in deinem Programm nichts weiter machen.

      Gruß
      To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

      At some point in time, you recognize that knowing more does not necessarily make you more happy.
      Hey. Danke :)

      Also, dann stehts fest: Die Lib ist mit von der Party.
      Das erspart mir ein gutes Pluginsystem zu programmieren, da mir schon bei mehreren Versuchen irgendwas die Füße gelegt hat.

      Außerdem hab ich genug mit den Core-Features zu tun ...


      Also, wie ich das mit der GUI mach, werd ich dann sehen ;) Danke aber für das Beispiel.


      Das mit dem Laden der Plugins hab ich bereits gemeistert. Ich stelle vor den "(Splash)Loader" von TKMap. Frisches Design und sehr funktional.
      (Das in der Mitte hat noch einen zu scharfen Übergang. Da muss ich mir noch was überlegen ;))


      Jedes Plugin kann da einen LoadingStep eintragen. Die Gruppe (Liste) ruft dann über das Interface die Funktion Load() auf und das Plugin
      lädt sich dann selbst.

      PS: Nein ich hab dir keine E-Mail geschickt ;) War wohl wer anders ;)

      MfG
      R
      Gute Idee, so kann man viel individuellere Ladedetails anzeigen ^^
      Ich habe zwar keine Ahnung, was du das codest, aber es sieht gut aus ;)

      Viel Spaß ;P

      Gruß
      To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

      At some point in time, you recognize that knowing more does not necessarily make you more happy.
      Joa bei TKMap geb ich mir extrem viel Mühe. Ich denke, das ist dann mein Lebenswerk im Bereich der Programmierung.

      Nicht nur der Loader ist so aufgebaut, dass er flexibel ist.

      Hierbei können Plugins einen LoadingStep hinzufügen. Dieser wird in der Group gespeichert und in dessen Liste eingetragen.
      Sobald der Loader Die FUnktion "LoadAllSteps()" der Gruppe aufruft, werden diese nacheinander geladen. Der Fortschritt wird dabei auch angezeigt.

      Ich hab mir für TKMap vorgenommen Funktion und Optik wirklich ohne Schweißnaht zusammenzufügen.
      Dazu nutze ich einige Control-Libs welche Vista-API´s verwendet.

      Somit fällt leider jegliche XP-Unterstützung weg. Aber bis es TKMap gibt ist XP wirklich ein altes Eisen,
      und irgendwann muss man anfangen in die Zukunft zu denken.

      MfG
      R
      Hi, wie kann ich rausfinden was für funktionen in der Dll sind?
      Ich hab das ausprobiert:

      VB.NET-Quellcode

      1. Dim Manager As New PluginLib.PluginLib("$plugin", "PluginLibTest")
      2. Manager.AddVariable("PluginName")
      3. Manager.AddVariableOptional("Version", "1.0.0.0")
      4. Manager.LoadPlugins("C:\Users\Chef\Documents\Visual Studio 2010\Projects\pluginlibuse\pluginlibuse\bin\Debug\Plugin\", IO.SearchOption.TopDirectoryOnly)
      5. For Each Plugin As KeyValuePair(Of String, PluginLib.Plugin) In Manager.GetPlugins()
      6. Dim X As Dictionary(Of String, PluginLib.MethodData) = Plugin.Value.GetMethods()
      7. For Each Y As Collections.Generic.KeyValuePair(Of String, PluginLib.MethodData) In X
      8. RichTextBox1.Text += Y.Key
      9. Next
      10. Next


      Jedoch wird nichts in der Textbox angezeigt. Wieso?

      /edit:
      Wenn ich z.b in der ersten schleife das mache:
      Plugin.Value.GetMethod("TestMethode").Invoke.ToString()

      gibt er mir die "PluginLib.MethodNotFoundException" Exception

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