2009-04-12 5 views
4

Ich versuche ein Plugins-System mit .NET zu erstellen, und ich bin mir nicht sicher, ob ich es richtig mache. Die Grundlage des Systems ist, dass ein spezifisches Verzeichnis ({apppath}/Plugins /) eine Menge vorkompilierter DLLs enthält, und ich möchte jeden mit Reflektion und für jede verfügbare Klasse durchsehen, wenn es eine bestimmte Basisklasse erbt (Dies ist in einer weiteren DLL definiert, aber ich werde später darauf eingehen.) Erstellen Sie dann eine Instanz davon und rufen Sie eine bestimmte Funktion in dieser Instanz auf.Creatinstance() - Mache ich das richtig?

Das spezifische Problem, das ich habe, ist, bin ich nicht sicher, dass dies der richtige Weg ist, dies zu tun. Würde die Methode, die ich versuche zu arbeiten, funktionieren, wenn angenommen werden kann, dass A.Plugin() tatsächlich existiert und alle Strukturen und Klassen, auf die hier verwiesen wird, fehlerfrei sind? Wenn jemand mehr Code benötigt, um zu helfen, kann ich ihn posten.

Antwort

3

Insgesamt sollte die Strategie funktionieren. Der Aufruf Assembly.LoadFrom lädt die Zielbaugruppe in den Prozess. Von dort aus ist es möglich, eine Typprüfung durchzuführen und Instanzen dieser Typen zu erstellen.

Ich denke, die einfachste und zuverlässigste Methode zum Erstellen der Instanz ist die Activator.CreateInstance-Methode.

Je nach Ihren Zielen wäre ein weiterer Vorschlag, den Try/Catch-Block in die Schleife zu verschieben, anstatt ihn auszublenden. Wenn Sie den Try/Catch-Block außerhalb der Schleife verwenden, bedeutet dies, dass Sie alle Typen dieser Assembly verwerfen, wenn ein bestimmter Typ in einer Assembly einen Fehler aufweist. Wenn Sie sie nach innen verschieben, können Sie nur die Typen verwerfen, die nicht wie erwartet funktionieren. Das aktuelle Verhalten könnte jedoch Ihre Absicht sein.

+0

Meinst du inst.Plugin()? – Sukasa

+0

@Sukasa, ja. Ich habe es korrigiert. – JaredPar

+1

Okay, ich war mir nicht sicher, ob es einen kleinen Trick gab, von dem ich nichts wusste. Vielen Dank! – Sukasa

1

Das sollte funktionieren, ich habe diese Art von Sache in einigen Projekten zuvor verwendet. Ich suchte gezielt nach einem Konstruktor und rief ihn an, aber abgesehen davon war es dieselbe Idee.

Aber Sie könnten sich vielleicht MEF ansehen, die eine Menge Dinge für Sie für eine Plugin-Architektur kümmert (wenn Sie bereit sind, ein wenig auf die Release-Version warten, ist es immer noch CTP für jetzt).