![]() |
Womit höchstmodulare WPF-Anwendungen erstellen?
Hi ihr,
Frage steht eigentlich schon im Titel - womit geht das am Besten? Ziel ist eigentlich, dass ich eine Basisanwendung erstelle, und anschließend alles über Zusatzplugins gelöst wird, die auch nach belieben hinzugefügt oder weggelassen werden können. Das Kernprogramm übernimmt nur die Steuerung der Kommunikation der einzelnen Elemente und verwaltet die Module. Womit könnte ich sowas in CSharp + WPF umsetzen? |
AW: Womit höchstmodulare WPF-Anwendungen erstellen?
Na da fallen mir spontan gleich 2 Kürzel ein, mit denen sich das Problem einfachst lösen läßt:
![]() ![]() Die Lernkurve ist nicht ganz klein, aber es lassen sich damit dann wirklich einfach Anwendungen erstellen, die über Plugins erweitert werden können. Zumindest MEF nutzt Microsoft selbst, um ihr Visual Studio 2010 mit Addins erweiterbar zu machen. Ich nutze beides seit einiger Zeit zusammen und bin echt begeistert. |
AW: Womit höchstmodulare WPF-Anwendungen erstellen?
Ein Plugin-System ist in .NET mittels ein paar Zeilen zu machen.
Man braucht lediglich ein Interface, welches das Plugin implementieren muss. Mittels Reflection kann man dann alle alle Assemblies mit den Plugins (z.B. aus einem bestimmten Verzeichnis) laden, dort nach Klassen suchen die dieses Interface implementieren, diese instanzieren und that's it. Das finden der entsprechenden Klassen ist mit LINQ ein Einzeiler: Assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(YourInterface))) |
AW: Womit höchstmodulare WPF-Anwendungen erstellen?
Danke euch beiden...
@Phoenix: SO einfach? :gruebel: Und mit dieser Methode kann ich auch dynamisch Assemblies laden? Ich bin mir noch nicht ganz sicher, wie ich das genau umsetze. Eigentlich möchte ich dem User die Möglichkeit geben, für eine Aktion zwischen mehreren Modulen wählen zu können und ggf. ein Standardmodul zu definieren. Ähnlich wie Android, welches ja auch komplett modular aufgebaut ist. |
AW: Womit höchstmodulare WPF-Anwendungen erstellen?
Naja, ein paar Zeilen mehr sinds schon.
Erstmal alle Files die mit .dll enden laden:
Code:
Nun hast Du alle Assemblies verfügbar und kannst daraus alle Typen ermitteln, die Du benötigst. Dazu gibts ne kleine Helfermethode:
foreach (var file in Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll"))
{ try { Assembly.LoadFrom(file); } catch { } // fine here. Existing .dll could be a native library }
Code:
Sagen wir Du hast ein Interface namens IMyPlugin und das definiert ne Methode Load() dem Du Deinen Plugin-Host übergibtst, dann initialisierst Du alle Plugins so:
private static List<Type> FindTypes<T>()
{ return AppDomain.CurrentDomain.GetAssemblies() .Select(a => a.GetTypes()) .SelectMany(a => a.Where(t => t.IsClass && !t.IsAbstract && typeof(T).IsAssignableFrom(t))) .ToList(); }
Code:
In load können die sich dann in ne List<IMyPlugin> auf dem Host legen oder Du merkst Sie Dir irgendwie anders.
foreach (var pluginType in FindTypes<IMyPlugin>())
{ IMyPlugin instance = (IMyInterface) Activator.CreateInstance(pluginType); instance.Load(this); // oder whatever halt } Wenn Du nicht gleich alle instanzieren willst kannst Du natürlich auch einfach die Typen aus der Liste anzeigen und nur einzelne instanzieren. Mittels Custom Attributen kannst Du auch noch weitere Informationen zu den Plugins ausgeben etc. .NET ist da ziemlich mächtig *g* |
AW: Womit höchstmodulare WPF-Anwendungen erstellen?
Hm... Ich bin grad über
![]() //Edit: Ach... Danke fürs Beispiel... :) |
AW: Womit höchstmodulare WPF-Anwendungen erstellen?
Was mir in dem Zusammenhang noch einfällt, wäre
![]() |
AW: Womit höchstmodulare WPF-Anwendungen erstellen?
Also mein erster Tipp wäre auch Prism gewesen. Der zweite Caliburn.Micro mit MEF. 8-)
|
AW: Womit höchstmodulare WPF-Anwendungen erstellen?
Danke euch - auch wenn ich noch ein wenig Schlucke, was die Lernkurve von Prism angeht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz