Großes Programm aus vielen Einzelkomponenten (vgl. Visual Studio) - wie macht man das

  • Allgemein

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

    Großes Programm aus vielen Einzelkomponenten (vgl. Visual Studio) - wie macht man das

    Hi,

    Ich hab ein Programm mit dem ich nicht ganz zufrieden bin: Eigentlich sollte es aus mehreren einzelnen Tools bestehen, die alle zusammenarbeiten sollen. Eigentlich soll es so aufgebaut sein wie Visual Studio mit seinen einzelnen Tabs und Fenstern...

    Aus Mangel an Erfahrung hab ich alles in einem Projekt und dort mittlerweile über 10 einzelne Formen. Alle hab ich dann auf ein MDIParent draufgepackt.

    Meine Probleme: Programm ist langsam, groß, ich bekomm oft System.OutOfMemoryExceptions (weiß net ob die auch daher kommen), und selbst Visual Studio braucht lang zum laden und es ist sehr unübersichtlich

    Meine Hoffnung/Frage: ich hab schon gesehen, dass man Programme mit DLLs erweitern kann (also denk ich mir, dass man einzelne Tools da trennen kann), dass man das Programm in mehrere EXE zerlegt (bei Google Chrome ist das ja so) und dass man das Design von Visual Studio für die Tabs und so übernehmen kann (Das Visual Studio Design und das Google Chrome Design hab ich schon beide in anderen Programmen "verbraten" gesehen^^)

    Nur weiß ich zu den 3 Punkten keine Lösung^^
    Eigentlich macht es keinen Unterschied, ob man nun Programmteile in Dlls auslagert, oder nicht. Der Code wird nach dem Laden sowieso genau gleich ausgeführt. Normalerweise ist man auch mit im .Net-Bereich schnell genug für viele komplexe Dinge. Wenn Dein Programm langsam läuft und Du OutOfMemoryExceptions bekommst, dann liegt das wahrscheinlich (ziemlich sicher) an Deinem Code, und nicht an der Größe des Projektes.
    Man lagert Programmteile eigentlich fast nur dann aus, wenn man das ausgelagerte irgendwo anders nochmal verwenden möchte. Oder, wenn es sich einfach anbietet (oder es erforderlich ist, zwei getrennte Programme zu haben).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Eigentlich macht es keinen Unterschied, ob man nun Programmteile in Dlls auslagert, oder nicht. Der Code wird nach dem Laden sowieso genau gleich ausgeführt.
    Man lagert Programmteile eigentlich fast nur dann aus, wenn man das ausgelagerte irgendwo anders nochmal verwenden möchte. Oder, wenn es sich einfach anbietet (oder es erforderlich ist, zwei getrennte Programme zu haben).

    Und wie läuft des z.B. bei Paint.NET, mit den Erwiterungen? Die sind ja auch DLLs und werden erst während der Laufzeit eingebaut...
    Die werden via Reflection geladen. Das ist wieder nen bisschen komplizierter. Da du nicht weißt welche Dlls du haben wirst, musst du das dynamisch laden.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @Sederic Enders:
    Wie thefiloe schon erwähnt hat, werden diese Dlls per Reflection geladen.
    Das hat aber mit der Performance nichts zu tun, sondern damit, dass jeder User seine eigenen PlugIns hinzufügen kann. Die PlugIn-Projekte verweisen auf eine Dll des Paint.Net-Projektes, in der die Basisklasse bzw. das Interface für PlugIns definiert ist.
    Die fertige PlugIn-Dll wird in den PlugIn-Ordner kopiert.
    Beim Starten lädt Paint.Net alle Assemblies, die sich in diesem Ordner befinden. Per Reflection können dann alle Typen gefiltert werden, die als PlugIn verwendet werden können. Das kann beispielsweise geschehen, indem man prüft, ob der typ ein Interface implementiert oder ob er von einem anderen Typ abgeleitet ist.

    Genau genommen ist es sogar aufwändiger, PlugIns über Reflection zu laden, da die Dlls nicht direkt als Verweis in der Haupt-Assembly vorhanden sind. Also aus Performancegründen macht man das nicht.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Vllt. mal ein paar Worte zum Aufbau einer Projektmappe.
    Wenn Du ein Projekt erstellst, wirst Du gefragt, ob Du eine Projektmappe erstellen willst - Ja.
    Nun kannst Du zu deinem einen Projekt weitere Projekte hinzufügen, andere EXEn oder auch DLLs.
    Wenn Du Code aus Deiner Exe in eine DLL auslagern möchtest, ist dies der richtige Weg. Leg Dir eine DLL in Deiner Projektmappe an und füge ihr den entsprechenden Code hinzu.
    Diese DLL fügst Du nach Erwtellung Deiner Exe als Verweis hinzu.
    Oder Du hast ein fertiges DLL-Projekt, das fügst Du dann einfach als vorhandenes Projekt Deiner Projektmappe hinzu.
    Wenn Du mehrere EXEn in Deiner Projektmappe hast, musst Du festlegen, welche dieser das Startobjekt ist.
    Und dann einfach los. :D
    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!
    @RodFromGermany:
    Mir ist aufgefallen, dass Visual Studio (2010 Express) manchmal die Release-Dateien der Projekte, die bereits existieren, selbst sperrt und nicht mehr überschreiben kann, wenn man die Projektmappe kompiliert.
    Schließt man Visual Studio und öffnet es wieder, funktioniert's.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Niko Ortner: K.A., ich hab Ultimate, da geht das wie es soll.
    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!