Laden...

Bestimmtes Plugin-System erstellen

Erstellt von coderlol vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.234 Views
C
coderlol Themenstarter:in
2 Beiträge seit 2011
vor 13 Jahren
Bestimmtes Plugin-System erstellen

Hallo CSharp-Community!

Ich wende mich mit einem Problem an euch, das mich nun schon seit einigen Tagen beschäftigt.

Natürlich habe ich zuvor einige Artikel zu meiner Problematik im Netz gefunden, jedoch waren diese entweder zu allgemein oder zu speziell und jeder Artikel benutze eine andere Methode, weswegen ich nun ziemlich verwirrt bin ...

Ich habe ganz bestimmte Vorgaben und brauche hierzu ganz bestimmte Lösungsvorschläge 😃

Seit einigen Tagen schreibe ich ein IRC-Client, welcher mittels Plugins während der Laufzeit in seiner Funktionalität erweitert werden soll.
Hierzu liest der PluginManager sämtliche DLL-Dateien in einem zuvor definierten Ordner ein und soll diese nun in den Speicher laden, damit ich ein Objekt der Klasse erstellen kann.

Hierbei sind folgende Umstände gegeben:*Jede DLL-Datei beinhaltet eine bestimmte Klasse, die IPlugin implementiert *Der Name der Klasse kann über den Dateinamen der DLL-Datei abgeleitet werden *Die DLL-Datei kann zudem mehrere, andere Klassen beinhalten, die von der Plugin-Klasse benutzt werden können, aber nicht vom PluginContainer gelesen werden müssen.

Im Grunde möchte ich, dass ich das gesamte Verhalten eines Plugins in einer DLL kapseln kann, ohne dynamisch während der Laufzeit C#-Code kompilieren zu müssen.

Programmablauf:

  1. PluginManager liest sämtliche DLL-Dateien in [ORDNER]
    2a. PluginManager erstellt eine Instanz der Plugin-Klasse (Plugin-Klasse => DLL-Dateiname)
    2b. PluginManager ruft eine statische Methode in der DLL auf, die eine Klasseninstanz der Plugin-Klasse zurückgibt (?)
  2. PluginManager ruft eine Reihe von Methoden der einzelnen Plugin-Instanzen auf, die in IPlugin definiert sind.

Leider bin ich noch ziemlich grün hinter den Ohren, was DLL-Import angeht, jedenfalls in diesem Ausmaß.
Für die fachkräftigen C#-Programmierer unter euch ist dies wahrscheinlich ein wiederkehrendes, fast lästiges Problem, doch für meiner Eins ist es recht komplex ... 😦

Ich hoffe ihr könnt mir helfen - für weitere Fragen stehe ich gerne zur Verfügung und versuche diese so schnell wie mir möglich zu beantworten.

173 Beiträge seit 2009
vor 13 Jahren

Das sollte sich alles mittels MEF lösen lassen.

Am Besten guckst du dir mal das Video dazu an:
Webcast: Managed Extensibility Framework - Eine Einführung

Da wird die Technik recht gut erklärt

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo coderlol,

mit MEF kann man solche Probleme sehr einfach lösen. Dazu musst du lediglich ein Interface bereistellen und auf dieses Interface exportieren. Die Anwendung lädt dann über einen _DirectoryCatalog _die DLL-Dateien. Anschließend werden die Abhänigkeiten aufgelöst. Neben dem Interface kannst du noch ein weiteres Interface bereitstellen, indem weitere Informationen über das Plugin/Extension enthalten sind. Ich würde dir raten, dich mal in MEF einzulesen.

Siehe auch [FAQ] Eigene Anwendung pluginfähig machen. Beachte, dass MEF Bestandteil von .NET 4 ist. Du kannst auch auf CodePlex dir die orginale Version von MEF herunteralden und auf .NET 3.5 kompilieren.

zero_x

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo coderlol,

was genau ist dein Problem? Klar, es gibt sehr unterschiedliche Konzepte, wie man Plugins realisieren kann, aber du hast ja sehr konkrete Vorstellungen, wie es bei dir laufen soll und diese Vorstellungen sind vollkommen ok. Ich verstehe also deine Verwirrung nicht, bzw. dass du dein Konzept so klar beschreiben konntest, zeigt mir, dass du dich hast nicht verwirren lassen. Du musst das jetzt nur noch 1:1 umsetzen. Und wenn du so viele Artikel gelesen hast, wie du sagt, dann musst du irgendwo auch gesehen haben, wie man eine Assembly zur Laufzeit lädt und deren Klassen über ein Interface benutzt. Eigentlich gibt es also gar kein Problem. Du musst es nur tun.

MEF ist für das Konzept, was du beschreibt auf jeden Fall unnötig. Es geht direkt mit den Klassen des Frameworks.

herbivore

R
103 Beiträge seit 2009
vor 13 Jahren

@CoderLol

Genau so wie du das beschrieben hast kann man das auch machen.
Einzig die Definition vom IPlugin Interface musst Du vielleicht in eine extra assembly auslagern und dann statisch in deinen dlls und executable referenzieren.

C
coderlol Themenstarter:in
2 Beiträge seit 2011
vor 13 Jahren

Hey danke für die zahlreichen Tipps - ich habe mir das MEF-Video-Tutorial angeschaut, welches akunz gepostet hatte; sehr einfach zu verstehen und gut nachzuvollziehen.

Ich habe nicht lange gebraucht um das Plugin-System mit MEF nach meinen Vorstellungen aufzubauen und das Einbinden der Plugins funktioniert prima.

Somit ist eigentlich das Kernproblem gelöst und ich bedanke mich noch mal recht herzlich für alle Tipps von euch 😃

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo herbivore,

MEF ist für das Konzept, was du beschreibt auf jeden Fall unnötig. Es geht direkt mit den Klassen des Frameworks.

da bin ich anderer Meinung! Nenne mir doch bitte Gründe, warum MEF für den Fragensteller ungeeignet sein soll. MEF erfüllt alle Anforderungen und soll genau solche Probleme lösen. Das ist auch der Sinn von MEF.

zero_x

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo coderlol,

laut Titel ging es darum, ein "Bestimmtes Plugin-System [zu] erstellen". Dieses hat coderlol genau beschrieben. Es ist möglich, genau das direkt in .NET um zusetzen. MEF wird dafür nicht benötigt. Nichts anderes habe ich gesagt.

herbivore