Hallo,
ich habe ein kleines Problem mit dem casten bzw. dem Konvertieren von Plugins. Ich habe ein kleines Plugin System definiert und dieses enthält die folgenden Dll's (Vereinfachung meines Systems).
Im PluginHost.dll werden alle Plugins gesucht, instanziiert usw.. Die Datei PluginManager.dll enthält die Interfaces über die sich Plugin und PluginHost unterhalten (IPlugin). Die PluginImplementierung.dll wiederum enthält eine konkrete Implementierung vom Interface IPlugin (also das eigentliche Plugin).
Ich habe also die folgenden Dateien.
\bin\debug\PluginHost.dll
\bin\debug\PluginManager.dll
\bin\debug\Plugins\PluginImplementierung.dll
\bin\debug\Plugins\PluginManager.dll
In der unteren Methode versuche ich eine Instanz des Plugins zu erzeugen. Mit Activator.CreateInstance kann ich auch erfolgreich ein object erzeugen. Leider funktioniert das casten zu einem "IPlugin" nicht 😦.
Ich denke das Problem liegt darin begründet, dass die PluginManager.dll im Ordner debug und Plugins liegt. Im PluginHost.dll habe ich das Interface aus "debug" und in PluginImplementierung.dll aus "Plugins" geladen.
Wie kann ich denn dieses Problem lösen??????
public IPlugin CreateInstance(AvailablePlugin pluginData)
{
// Lade plugin aus dem assembly
Assembly objDLL = Assembly.LoadFrom(pluginData.AssemblyPath);
Type pluginType = objDLL.GetType(pluginData.ClassName);
// erstelle eine Instanz von PluginImplementierung
object objPlugin = Activator.CreateInstance(pluginType);
// erstelle ein IPlugin
// pluginExemplar ist null
IPlugin pluginExemplar = objPlugin as IPlugin;
// objPlugin is IPlugin gibt false zurück
// die folgende Zeile liefert eine InvalidCastException
IPlugin pluginExemplar2 = (IPlugin)objPlugin;
return objPlugin;
}
Der folgende Fehler tritt hierbei auf "(IPlugin)objPlugin;".
Fehlermeldung:
"System.InvalidCastException: Das Objekt des Typs "PluginImplementierung" kann nicht in Typ "IPlugin" umgewandelt werden.\r\n bei PluginHelper.CreateInstance(AvailablePlugin pluginData)"
Hallo, Und Du hast wirklich nur eine Klasse IPlugin?
Das mit den 2 Verzeichnissen sollte kein Problem sein, wenn es sich um die selbe dll handelt. Übrigens hat man mit vs Studio auch mal schnell per falschen tastendruck ein neues Interface erstellt..
Und schau mal mit dem Debugger ob die Klasse die Du erzeugst auch wirklich IPlugin implementiert..
Hallo Paderfly,
Das mit den 2 Verzeichnissen sollte kein Problem sein, wenn es sich um die selbe dll handelt.
die denke, das reicht nicht; m.E. muss in beiden Fällen ein- und dieselbe DLL am selben Ort referenziert werden (keine Kopie). Im Zweifel musst du die DLL in den GAC schieben.
herbivore
Da ich gerade an der gleichen Problematik arbeite, kann ich dir sagen, dass herbivore Recht hat. Du solltest die referenzierte Interface dll auf false bei Lokale Kopie setzen. Und dein Plug-In muss natürlich auch dein IPlugIn Interface implementieren.
Hey,
danke nochmal für eure Tipps, das hat mir sehr geholfen 😃. Das Problem war die app.config in der ich die folgenden Zeilen vergessen hatte 😦
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Plugins"/>
</assemblyBinding>
</runtime>