Eigenes AddOn basteln

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von zn-gong.

    Eigenes AddOn basteln

    Ich wollte mal fragen, wie man sich für sein eigenes Programm AddOns basteln kann ohne in die eigentliche *.exe zu müssen?
    Freue mich über viele Anworten

    --Marceliboy
    Wie willst du denn AddOns "basteln" wenn dein Hauptprogramm nichts von denen weiß?
    Wie sollen die AddOns denn aufgerufen werden?

    Zuerst muss dein Hauptprogramm so entwickelt sein das es in der Lage ist auf AddOns zu reagieren.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    1) Du erstellst eine dll, die ein Interface besitzt. In diesem Interface erstellst du eine
    Methode, die das Programm beim Laden aufruft.

    2) Danach setzt du einen Verweis dieser dll in dein Hauptprogramm. Beim Laden etc. gehst du
    alle dll Dateien in einem bestimmten Verzeichniss durch. Die dll (Plugins) Dateien in
    deinem Verzeichniss werden dann Dynamisch dem Projekt Hinzugefügt und jeweils die
    oben erstellte Methode aufgerufen.

    3) Die Plugins erben ebenfals aus der dll aus dem Punkt 1. Nun hast du eine Klasse von dem Interface
    mit der Methode. Mit dieser Methode kannst du nun dein Plugin bauen.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Marceliboy schrieb:

    viele Anworten
    Eine reicht.
    Plugin-System, gugst Du z.B. hier.
    Ab Framework 4.0 gibt es eine wesentlich elegantere Form, da hab ich jetzt allerdings keinen Link zu.
    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!
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯
    und was steht links, rechts und oberhalb von

    Marceliboy schrieb:

    [Interface].myInterface
    :?:
    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!
    Also hier mal eine Methode, basiert auf meinem Post oben. Zuerst ist eine DLL Anwendung zu erstellen. Die dll wird das Template für die Plugins.

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace PluginTemplate
    7. {
    8. public abstract class Plugin
    9. {
    10. public abstract void InitialPlugin(Object Param);
    11. }
    12. }


    Nun haben wir das "Template" für das Plugin. Jetzt erstellen wir eine dll Anwendung für unser eigendliches Plugin. Bitte keinen Namespace nutzen. bzw. ich nutze keinen.

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. public class Plugin : PluginTemplate.Plugin
    7. {
    8. public override void InitialPlugin(object Param)
    9. {
    10. System.Windows.Forms.MessageBox.Show("Hello World");
    11. }
    12. }



    Wie Ihr seht, erbt diese Klasse von dem Template, dass oben erstellt wurde. Nun kommen wir zu dem Programm, dass das Plugin ausführen soll. Ich habe dafür eine Funktion erstellt.

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace WindowsFormsApplication3
    11. {
    12. public partial class Form1 : Form
    13. {
    14. public Form1()
    15. {
    16. InitializeComponent();
    17. }
    18. private void Form1_Load(object sender, EventArgs e)
    19. {
    20. PluginInitial(Application.StartupPath + "\\Plugin");
    21. }
    22. private void PluginInitial(String path)
    23. {
    24. foreach (String FileName in System.IO.Directory.GetFiles(path))
    25. {
    26. System.IO.FileInfo info = new System.IO.FileInfo(FileName);
    27. if (info.Extension.Equals(".dll"))
    28. {
    29. System.Reflection.Assembly dll = System.Reflection.Assembly.LoadFile(FileName);
    30. PluginTemplate.Plugin plugin = (PluginTemplate.Plugin)dll.CreateInstance("Plugin");
    31. plugin.InitialPlugin(null);
    32. }
    33. }
    34. }
    35. }
    36. }


    WICHTIG: SOWOHL DAS PLUGIN UND DIE ANWENDUNG MUSS EIN VERWEIS ZU DEM TEMPLATE HABEN:
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    SeriTools schrieb:

    Ohne vernünftige Fehlerabfrage ist dein Code definitiv nur Gehacke.

    Und selbst dann wäre es nichts als "Gehacke". Ist noch freundlich ausgedrückt.
    Bei dem "Gehacke" wird eine abstrakte Klasse verwendet wo ein Interface zu 10000% ausreichen würde, wird der Name der Plugin-Klasse vorgegeben (nämlich "Plugin"), ...
    Sagen wir wie es ist, es ist einfach für die Praxis untauglich.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hallo,

    Die "eigentlich" exe muss nur ein mal zur entwicklungszeit darhin geändert werden dass man ein Autoloader erstellt der die Verweise auf's Plugin / Addon programm zur laufzeit lädt. Stichwort: System.Reflection.

    Desweiteren muss ein "gemeinsamer connector" der mindestens 1 (oder mehrere) Interfaces (Schnittstellen) besitzt die von der exe (zur laufzeit) declariert und inizialisiert, und von dein addon inplementiert werden.

    Sinvoll ist es auch (bei MDI (Multi Dokument Interface) Anwendungen die ParrentForm zu übergeben damit das fenster was weitere Fenster erstellt diese in MDI-Kontainer erstellt. Wo bei es dazu ausreicht die Daten von Me "zu klauen".

    Ich würde übrigens der Performance wegen ein entweder ein eigenes plugin verzeichniss erstellen oder die Dateierweiterung ändern (achtung, das erschwer das Debugging extrem^^) da es ansonsten unweigerlich dazu kommt das deine routine auch alle potenziell vorhandenen verweiß assemblys einliest, da diesen aber dass inplementierte interface fehlt wird es unweigerlich zu einer exception kommen, diese müsste dann gegebenfalls abgefangen werden.

    Natrürlich kann man auch beides machen, also eigenes verzeichniss und eigene Dateierweiterung (extension).

    Hier in Forum giebt es auch einige Tutorials wie man halt eben eigene Plugin Systeme sammt Plugins baut, es ist jedoch kein reiner C&P-Coode, d.h. nach den C&P und den eresten erfolgreichen ausführen sind gegebenfalls noch weitere anpassungen (hier sei besonders das Interface genannt^^) an das eigene Programm und die dadrinnen endhaltenen logischen srukturen auszuführen.

    LG, Herbrich