Modular erweiterbares Programm

  • VB.NET

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

    Modular erweiterbares Programm

    Hallo, ich möchte gerne ein Programm erstellen, welches bisher nur wenige Aufgaben erledigen kann, langfristig aber erweiterbar sein soll.

    Alle Aufgaben sollen über eine Hauptform gestartet werden. Einige davon können "unsichtbar" ablaufen, andere benötigen eine eigene Form mit Ein- und Ausgabe-Möglichkeiten.

    Im Idealfall würde ich den Usern einfach Plugins zukommen lassen (als DLL oder so) und das Programm erweitert sich bei Neustart selbst.

    Welche Technik ist für so ein Projekt zu empfehlen? Habe schon einiges über Google gelesen, bekomme aber kein Konzept zusammen. Würde mich gerne irgendwo einlesen, brauche aber wohl einen Schubser in die richtige Richtung :)
    @typx Plugins sind genau das ichtige, was Du brauchst.
    Nur musst Du überlegen, was Dein Programm alles können soll.
    Für jedes dieser Funktionalitäten brauchst Du eine Gruppe von Interfaces.
    Z.B. Ansteuerung von Kameras verschiedener Hersteller
    Grundfunktionalität:
    • Initialisierung
    • Parameterübertragung
    • Snapshot
    • ...
    Nebenfunktionalität Parameter:
    • Breite, Höhe
    • Auflösung (Mono / Farbe, n BitPerPixel)
    • Belichtungszeit
    • Gain
    • ...
    Ansteuerung von Schrittmotoren
    Kommunikation mit einer SPS
    ...
    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!
    Prinzipiell ist es recht einfach. Es handelt sich um automatisiertes prüfen, ändern, ent- bzw verschlüsseln vieler, großer Textdateien. Habe dafür schon mehrere kleine Programme, würde sie aber gerne zu einer großen Sammlung zusammenfügen.

    Nach und nach sollen verschiedene Funktionen implementiert werden, welche per ComboBox ausgewählt und gestartet werden können. Landet ein neues Plugin im Ordner, soll es in der ComboBox auftauchen und gestartet werden können. Alternativ hatte ich mir auch Tabs überlegt, so dass alles in der gleichen Form abläuft und nicht für jede Komponente ein eigenes Fenster aufgeht.
    @typx Worin besteht denn der Unterschied einzelner Plugins bei Dir?
    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!
    Sie bearbeiten verschiedene Dateien auf verschiedene Weise. Eins ist ein Texteditor, ein anderes sucht nach Strings und ersetzt Werte usw.

    Die Gemeinsamkeit ist lediglich, dass die Textdateien in Verbindung stehen bzw teilweise auch die selben sind.

    Prinzipiell sind es alles eigenständige Mini-Programme, die ich in einem großen Programm zusammenfassen möchte und immer wieder sollen neue hinzugefügt werden, wenn Bedarf besteht.
    @typx Nach welchen Kriterien wird unterschieden, welches Plugin zum Einsaz kommt?
    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!

    typx schrieb:

    welche Programmfunktion er starten möchte.
    Und worin besteht dann Deine Aufgabe?
    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!
    Steht doch alles bereits oben :D

    Im Endeffekt soll das Hauptprogramm sowas wie ein Launcher sein, ein Hauptmenü von dem aus die einzelnen Programmteile ausgeführt werden können. Natürlich könnte ich auch alles wie bisher als einzelne .exe Files ausliefern, aber eine einheitliche Oberfläche welche mit neuen Funktionen erweitert werden kann, ist doch sauberer.
    @typx Offensichtlich nicht, denn meine konkreten Fragen werden von Dir eher flach beantwortet.
    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!
    Oh, ich dachte das wäre ausreichend. Habe mal versucht, es grafisch darzustellen. In diesem Beispiel befinden sich programm1.dll und programm2.dll im Ordner.



    Bekommt ein User von mir nun programm3.dll und kopiert sie in den Ordner, soll beim nächsten Start ein dritter Tab vorhanden sein und Programm 3 darstellen, wenn man darauf klickt.


    Alternativ hatte ich mir auch eine simple ComboBox überlegt, in der man zwischen Programm1 bis ProgrammX wählen kann, dann auf einen Button "Start" klickt und sich ein neues Fenster mit dem jeweiligen Programm öffnet.


    Ich hoffe, ich konnte meine Idee jetzt gut rüberbringen :)


    Edit: "Programm" ist vielleicht etwas zu viel. Hauptsächlich sind es Formen die angezeigt werden müssen, die Funktionen sind großteils schon in Modulen vorhanden.
    @RodFromGermany hats dir schon beantwortet. Das schreit ja schon direkt nach einem Pluginsystem.

    Schau mal: Wie erstelle ich ein PlugIn System unter VB.NET (Framework 2)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ja erlich, der Thread ist seit post #2 schon erledigt, da Frage beantwortet !
    Musst du wohl übersehen haben. :rolleyes:
    Jap, habe jetzt so ziemlich alles hinbekommen wie ich es möchte, danke schonmal :)
    Alle möglichen Variablen aus den Plugins werden übergeben, Funktionen werden ausgeführt usw. Jetzt bin ich bei dem Teil angekommen, an dem ich eine Form in einen Tab übergeben möchte, leider klappt das so nicht ganz. Wo habe ich hier den Denkfehler? Die Form ist im Plugin-Projekt erstellt.

    VB.NET-Quellcode

    1. 'Plugin:
    2. Public Function PluginTab() As TabPage Implements ClassPluginLoader.INewTab.PluginTab
    3. Dim Form As New FormMain
    4. Form.FormBorderStyle = FormBorderStyle.None
    5. Form.Dock = DockStyle.Fill
    6. Dim Tab As New TabPage
    7. Tab.Text = Name
    8. Tab.Controls.Add(Form)
    9. Return Tab
    10. End Function
    11. 'Hauptprogramm:
    12. Private Plugins As PluginLoader.ClassPluginLoader.INewTab
    13. Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    14. For Each PluginFile As String In IO.Directory.GetFiles(PluginDir, "*.dll")
    15. Plugins = ClassPlugInConnector.LoadPlugIn(PluginFile)
    16. TabControlMain.TabPages.Add(Plugins.PluginTab)
    17. Next
    18. End Sub


    Davor hatte ich versucht, die Form selbst als Returnvalue zu übergeben. Ich konnte sie mit Form.Show() im Hauptprogramm auch anzeigen lassen, allerdings habe ich sie nicht in den Tab bekommen. Der jetzige Ansatz funktioniert leider genausowenig.


    Edit: Habe es hinbekommen, musste lediglich 2 Zeilen hinzufügen. Das kommt davon, wenn man sich auf neue Dinge konzentriert :D

    VB.NET-Quellcode

    1. Form.TopLevel = False
    2. Form.Visible = True

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

    typx schrieb:

    an dem ich eine Form in einen Tab übergeben möchte
    Was soll denn der Tab mit der Form machen?
    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!