(Ich kenne die anderen MEF / MAF-Fragen, aber das ist ein spezifischeres Problem)
Ich möchte eine WPF-Anwendung erstellen, die im Grunde nur ein einfacher Add-In-Host, GUI und Einstellungen sein wird. Die gesamte Arbeit wird von einem oder mehreren Plugins erledigt. Sie müssen nicht miteinander kommunizieren, die Hauptanwendung sendet Benutzereingaben / Befehle an sie und sie werden einige Ergebnisse zurückgeben (z. B. WPF-Benutzeroberflächenelemente zum Rendern).
Jetzt, da der Kern der Anwendung auf Plugins basiert, muss ich einen guten Weg wählen, sie zu verwalten. Ich möchte sie zur Laufzeit laden / entladen / neu laden können (zum Beispiel wenn ein Update gefunden und heruntergeladen wird). Sie sollten wahrscheinlich in der eigenen Anwendungsdomäne und / oder im Prozess für Stabilität und Sicherheit laufen.
Aus einigen Untersuchungen und Experimenten habe ich drei Optionen gefunden:
System.Addin (MAF): Es scheint, dass dies alles tun kann, was ich brauche. Es gibt eine Pipeline, mit der mehrere API-Versionen gleichzeitig ausgeführt werden können, um Kompatibilität zu gewährleisten. Aber wenn ich etwas nicht vermisse, muss ich die API mehrmals erstellen - Host- und Plugin-Ansichten, Vertrag und zwei Adapter für den Vertrag. Auch gibt es wenig (im Vergleich zu MEF) Informationen und Ressourcen rund um und die meisten Artikel sind wenige Jahre alt. Ich bin besorgt, dass das langsam stirbt und es lieber nicht für ein neues Projekt verwenden würde.
MEF: Das scheint einfacher, aber es fühlt sich auch an, als gäbe es eine Menge Magie, die ich nicht kontrollieren kann, und die Schichten sind nicht so stark getrennt wie in MAF . Ich möchte nur eine kleine Bibliothek, die Sie mit einem neuen Projekt verknüpfen können, implementieren Sie die Schnittstelle und das Plugin ist fertig.
Manuelles Laden: Die letzte Option besteht darin, den Ordner manuell nach .dlls zu durchsuchen, Reflektionen zu verwenden, um Plug-in-Klassen zu finden und Instanzen zu erstellen. Obwohl es machbar ist, würde ich lieber ein Framework verwenden, als manuell Assemblys zu laden, separate Prozess- / Anwendungsdomänen usw. zu erstellen.
Also, welches wäre das Beste für diese Art von Anwendung, oder gibt es etwas, das ich vermisst habe?
MEF ist definitiv die einfachste Option der drei. Es wurde wirklich mit diesem exakten Szenario (erweiterbare Anwendungen) im Hinterkopf konzipiert.
Es handelt sich tatsächlich um den von Visual Studio verwendeten "plugin" -Mechanismus, bei dem es sich um eine WPF-Anwendung handelt. Alles, was Sie tun müssen, ist, dass Ihr "plugin" eine Schnittstelle implementiert oder von einer bekannten Basisklasse ableitet und das Attribut [Export]
hinzufügt. Sofern die Assembly zum Katalog Ihrer Hauptanwendung hinzugefügt wird, kann dieser Typ in einem Schritt von der Hauptanwendung [Import]
ed sein. Es ist sehr wenig Arbeit, um diese Arbeit zu machen.
Es wäre meine Empfehlung, es sei denn, es gibt einen guten Grund, eine andere Option zu wählen. MAF hat mehr Isolationsunterstützung, ist aber viel schwieriger zu verwenden, und die meisten Isolationsfunktionen können in einer WPF-Anwendung nicht verwendet werden, da die Benutzeroberfläche in WPF in keinem Fall isolierter Code sein kann.
Tags und Links wpf .net c# mef extensibility