Hallo,
ich habe ein kleines Plugin System gebaut und jetzt Probleme beim erzeugen einer Plugin Instanz. Ich erstelle mir eine Instanz mit Activator.CreateInstance oder Assembly.CreateInstance. Das funktioniert mit dem unten aufgeführten Beispielcode ganz gut.
Jetzt habe ich mir aber einen Unterordner "Plugins" angelegt und in diesen sollen alle Plugins kompiliert werden. Dann funktioniert der Beispielcode nicht mehr 😦. In dem Beispiel ist dann plugin1 immer null und bei plugin2 bekomme ich eine "System.InvalidCastException" -> "Das Objekt des Typs "Beispiel.PluginExample" kann nicht in Typ "Beispiel.IPlugin" umgewandelt werden."
public object createInstance(AvailablePlugin pluginData)
{
try
{
//Load dll
Assembly objDLL = Assembly.LoadFrom(pluginData.AssemblyPath);
Type pluginType = objDLL.GetType("Beispiel.PluginExample");
object objPlugin = Activator.CreateInstance(pluginType);
IPlugin plugin1 = objPlugin as IPlugin;
string plugin1Name = plugin1.getPluginName();
object objPlugin2 = objDLL.CreateInstance("Beispiel.PluginExample");
IPlugin plugin2 = (IPlugin)objPlugin2;
string plugin2Name = plugin2.getPluginName();
return null;
}
catch (Exception e)
{
return null;
}
}
Was mache ich falsch? Liegt das Problem bei den Referenzen zu anderen Assemblys? Ich meine im Plugins Verzeichnis liegen dann nochmal alle verwiesenen Assemblys (und in der Host Anwendung).
Ich wäre euch für Tipps dankbar
Daniel
Beim schreiben des Eintrags sind mir ein paar neue Begriffe zum suchen eigefallen und ich habe gerade eine Lösung im Forum gefunden.
Werde ich gleich mal ausprobieren 😃
Hallo Bubble,
für mich sieht das so aus, dass die Klasse nicht instanziiert werden kann, weil das Interface ein welches ist oder nicht die richtige Klasse ist. Prüf noch zur Sicherheit, ob die Referenzen alle stimmen und mach einen Rebuild.
Siehe auch [FAQ] Eigene Anwendung pluginfähig machen bzw. MEF und hier das.
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.
Mhh,
also das mit dem hinzufügen des Ordners "Plugins" zur app.config bekomme ich nicht richtig hin 😦. Ich bekomme trotzdem noch die gleichen Fehler 😦.
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Plugins"/>
</assemblyBinding>
</runtime>
@zero_x
also die Klassen und Interfaces stimmen alle. Die Klasse heißt "PluginExample" im Namensraum "Beispiel" und die Klasse implemetiert auch die Schnittstelle "IPlugin".
Es funktioniert ja auch, wenn die Plugins im Applikationsverzeichnis liegen. Nur eben nicht, wenn die Plugins in einem anderen Verzeichnis liegen.
Hallo Bubble,
Am einfachsten machst du folgendes, das funktioniert bei mir eigentlich immer:
object objPlugin = Activator.CreateInstance(System.Type.GetType("Beispiel.PluginExample,Beispiel"));
// AssemblyQualifiedName, nach dem Komma muss nur der Name der Assembly ohne Dateiendung stehen
Gruß
Juy Juka