PluginLib [2.1]

    • Release

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

      PluginLib [2.1]

      Beschreibung
      PluginLib ist eine umfangreiche Bibliothek, die das einfache Verwalten von Plugins für ein Programm ermöglicht. Vielerlei Methoden lassen die Plugins beliebig anpassen und auf das Programm zuschneiden. Eigene Speicherverwaltung entfällt, sämtliche Fehler werden durch Excecptions abgefangen und weitergeleitet. Zusätzlich ist PluginLib vollständig kommentiert!

      Features / Funktionen
      • Einfaches Laden via LoadPlugin(Path) und LoadPlugin(Path, Streamed)
        • Streamed gibt an, ob die Datei im Speicher gehalten wird. Wenn Streamed auf true gesetzt wird, kann die DLL solange sie geladen ist nicht verändert oder gelöscht werden
      • Durchdachtes Objekt orientiertes Konzept
      • Festlegen von Namespace und Klassenname
      • Hinzufügen von optionalen oder benötigten Variablen
        • Variablen können durch Object() in alle möglichen Typen konvertiert werden und sind nicht auf einige, wenige Typen begrenzt!
        • GetName() Methode lässt jederzeit auf Namen schließen
        • GetValue() gibt den aktuellen Wert der Variable zurück
        • SetValue() setzt einen Wert für die Variable

      • Hinzufügen von optionalen oder benötigten Properties
        • Properties können durch Object() in alle möglichen Typen konvertiert werden und sind nicht auf einige, wenige Typen begrenzt!
        • GetName() Methode lässt jederzeit auf Namen schließen
        • GetValue() gibt den aktuellen Wert der Property zurück
        • SetValue() setzt einen Wert für die Property

      • Hinzufügen von optionalen oder benötigen Methoden / Funktionen
        • Rückgabewerte können durch Object() in alle möglichen Typen konvertiert werden und sind nicht auf einige, wenige Typen begrenzt!
        • GetName() Methode lässt jederzeit auf Namen schließen
        • GetMethodInfo() gibt ein vollständiges MethodInfo-Objekt zurück
        • Invoke() ruft die Methode entweder mit oder ohne Parameter auf

      • Plugin via vollständigem Pfad laden oder gleich alle Plugins in einem Ordner laden
      • Plugin kann via DLL-Name angesprochen werden oder eine Schleife wird mittels GetPlugins() realisiert
      • InvokeMethodOnAllPlugins() ruft eine Methode entweder mit oder ohne Parameter in allen Plugins auf, so können Events in einer Zeile realisiert werden


      ToDo
      (Vorerst vollständig)
      Noch mehr Ideen? Her damit!

      Daten
      Sprache: VB.NET (Plugins & Programme können dank Assembly in allen .NET Sprachen geschrieben werden)
      .NET Framework: 2.0
      Autor: Chrisber
      Letzter Build: 14. August 2010
      Version: 2.1
      Dateigröße: 12,0 Kilobyte (+ 22,5 Kilobyte Dokumentationsdatei)
      Lizenztyp: Freeware, Closed Source

      Screenshot
      (nicht vorhanden da dies eine Bibliothek ist)

      Download
      PluginLib - DLL zum einbinden (7,33 Kilobyte)
      PluginLibTest - Beispielcode (Projekt) + Binary + Test Plugin (56,1 Kilobyte)
      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 6 mal editiert, zuletzt von „Chrisber“ ()

      Hi.
      @ Bunni: Ja darfst du machen. Ein Hinweis auf den Autor wäre zwar schön, aber nicht zwingend.
      @ andere: Danke :)

      ~ Chris
      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.
      Ähm, in der PluginLibTest.zip ist sehr wohl eine Exe dabei (bin/Release/)
      Damit das ganze compiled musst du die PluginLib.dll dem Projekt als Verweis hinzufügen und dann importieren.

      ~ Chris
      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, natürlich kann man das, sonst wäre die PluginLib wohl ziemlich nutzlos?!
      Les dir mal den ersten Post ausführlich durch und guck dir das Beispielprojekt an. Dort liegt ein Testplugin und ein Testprogramm bei, dass sowohl Variablen ausliest und Funktionen aufruft.

      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 schrieb:

      Ja, natürlich kann man das, sonst wäre die PluginLib wohl ziemlich nutzlos?!
      Les dir mal den ersten Post ausführlich durch und guck dir das Beispielprojekt an. Dort liegt ein Testplugin und ein Testprogramm bei, dass sowohl Variablen ausliest und Funktionen aufruft.

      Gruß
      Ok danke. ich hab mir das Beispiel angeschaut und da wird lediglich ein paar Variablen abgefragt, könntest du das Beispiel noch erweitern, das man auch sieht wie man Funktionen startet.
      O_O
      Natürlich werden da Funktionen aufgerufen, sogar 2 Stück.

      PluginLibTest.vb
      -> Zeile 48: TestMethode
      -> Zeile 57: PluginBeenden

      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.
      Die Funktion Plugin.Invoke() gibt ein Object zurück.
      Folgendes Beispiel:

      Die aufzurufende Funktion aus dem Plugin:

      VB.NET-Quellcode

      1. Public Function RufMichAuf() As String
      2. ' Irgendwas berechnen
      3. ' BlaBlub
      4. Return "Hallo, das ist ein Test"
      5. End Function


      Das Programm, dass die Funktion aufruft:

      VB.NET-Quellcode

      1. Dim Rueckgabe As Object = PluginManager.GetMethod("RufMichAuf").Invoke(New Object() { })
      2. Dim Text As String = Rueckgabe.ToString() ' Alternativ: Convert.ToString(Rueckgabe)
      3. MessageBox.Show("RufMichAuf hat folgenden Text zurueckgegeben:" + vbNewLine + Text)


      Das einfache konvertieren ist möglich, da alle Typen in .NET von Object abgeleitet sind.

      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 schrieb:

      Die Funktion Plugin.Invoke() gibt ein Object zurück.
      Folgendes Beispiel:

      Die aufzurufende Funktion aus dem Plugin:

      VB.NET-Quellcode

      1. Public Function RufMichAuf() As String
      2. ' Irgendwas berechnen
      3. ' BlaBlub
      4. Return "Hallo, das ist ein Test"
      5. End Function


      Das Programm, dass die Funktion aufruft:

      VB.NET-Quellcode

      1. Dim Rueckgabe As Object = PluginManager.GetMethod("RufMichAuf").Invoke(New Object() { })
      2. Dim Text As String = Rueckgabe.ToString() ' Alternativ: Convert.ToString(Rueckgabe)
      3. MessageBox.Show("RufMichAuf hat folgenden Text zurueckgegeben:" + vbNewLine + Text)


      Das einfache konvertieren ist möglich, da alle Typen in .NET von Object abgeleitet sind.

      Gruß
      Ok danke und wie sieht es aus wenn ich im Plugin-Propertys verwende.

      Edit:
      Ich habe dein Beispiel jetzt mal in dein PluginTest geschrieben und jetzt kommt die Fehlermeldung
      Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „singu“ ()

      Du musst mir schon den Code zeigen sonst sehe ich nichts.
      Properties können mit GetVariable ausgelesen werden (glaube ich).

      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.
      Hier mal der bisherige Code.

      VB.NET-Quellcode

      1. Imports System.IO
      2. Imports System.Reflection
      3. Module Module1
      4. Public Sub Main()
      5. Dim locPlugin As New PluginLib.PluginLib.PluginLib("$plugin", "PluginLibTest")
      6. With locPlugin
      7. Console.WriteLine("Instanz von PluginLib erstellt.")
      8. .AddVariable("PluginName")
      9. Console.WriteLine("PluginName wird als Variable vorausgesetzt.")
      10. .AddVariableOptional("PluginVersion", "1.0.0.0")
      11. Console.WriteLine("PluginVersion kann zus" & ChrW(228) & "tzlich angegeben werden.")
      12. .AddMethod("TestMethode")
      13. .AddMethod("RunPlugin")
      14. .AddMethod("GetInfo")
      15. Console.WriteLine("TestMethode muss zum Aufrufen vorhanden sein!")
      16. .AddMethodOptional("PluginBeenden")
      17. Console.WriteLine("PluginBeenden wird dann aufgerufen, wenn das Programm beendet wird.")
      18. .LoadPlugins((Path.GetDirectoryName(Assembly.GetExecutingAssembly.GetName.CodeBase).Replace("file:\", Nothing) & "\Plugins"), SearchOption.TopDirectoryOnly)
      19. Console.WriteLine("Alle Plugins aus dem Plugins-Ordner wurden geladen.")
      20. Console.WriteLine("")
      21. Dim locPair As KeyValuePair(Of String, PluginLib.PluginLib.Plugin)
      22. For Each locPair In .GetPlugins
      23. Console.WriteLine("Neues Plugin gefunden: " & locPair.Key)
      24. Console.WriteLine("Pluginname: " & locPair.Value.GetVariable("PluginName").GetValue.ToString)
      25. Console.WriteLine("Pluginversion: " & locPair.Value.GetVariable("PluginVersion").GetValue.ToString)
      26. locPair.Value.GetMethod("TestMethode").Invoke(New Object() {"Hallo Welt!"})
      27. locPair.Value.GetMethod("RunPlugin").Invoke()
      28. Dim locReturn As Object = locPair.Value.GetMethod("GetInfo").Invoke(New Object() {"Test"})
      29. MsgBox(Convert.ToString(locReturn))
      30. Console.WriteLine("TestMethode wurde aufgerufen")
      31. Console.WriteLine("")
      32. Next
      33. Console.ReadKey()
      34. .InvokeMethodOnAllPlugins("PluginBeenden")
      35. End With
      36. End Sub
      37. End Module
      Sicher, dass die Funktion auch existiert und einen String annimt? Um welche Zeile handelt es sich genau (ich vermute mal 32).

      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 schrieb:

      Sicher, dass die Funktion auch existiert und einen String annimt? Um welche Zeile handelt es sich genau (ich vermute mal 32).

      Gruß
      Es funktioniert jetzt auf einmal. Keine Ahnung an was es lag.

      Edit: Das mit den Propertys geht nicht. Kannst du erklären wie das geht?

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