Laden...

[erledigt] Explizite Konvertierung (Plugins)

Erstellt von Paderfly vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.367 Views
P
Paderfly Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren
[erledigt] Explizite Konvertierung (Plugins)

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).

  1. PluginHost.dll
  2. PluginManager.dll
  3. PluginImplementierung.dll

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)"

849 Beiträge seit 2006
vor 12 Jahren

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..

49.485 Beiträge seit 2005
vor 12 Jahren

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

T
253 Beiträge seit 2006
vor 12 Jahren

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.

P
Paderfly Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren

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>