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:
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.
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
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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
@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.
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 😃
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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