Laden...

Plugin Instanz mit Activator.CreateInstance (aus Unterordner)

Erstellt von Bubble vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.563 Views
B
Bubble Themenstarter:in
17 Beiträge seit 2009
vor 13 Jahren
Plugin Instanz mit Activator.CreateInstance (aus Unterordner)

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

B
Bubble Themenstarter:in
17 Beiträge seit 2009
vor 13 Jahren

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 😃

dll Vereichnisfür dynamischs Linken

1.044 Beiträge seit 2008
vor 13 Jahren

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

B
Bubble Themenstarter:in
17 Beiträge seit 2009
vor 13 Jahren

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.

2.187 Beiträge seit 2005
vor 13 Jahren

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