2017-06-28 1 views
0

I eine Basisklasse haben ...finden spezifische C# Klassentyp in dynamisch belasteten Montage dll

public abstract class PluginBase 
{ 
    ... 
} 

... und ich habe eine abgeleitete Klasse ...

public class Plugin : PluginBase 
{ 
    ... 
} 

... welches in MyDll.dll eingebaut wird.


Mein Ziel ist eine Instanz vom Typ PluginBase von einer Implementierung in MyDll.dll gefunden zu erstellen.

Hier ist mein Code.

laden I und die DLL-Schleife durch jeden Typ. Ich habe die Stelle markiert, wo die Typprüfung stattfinden sollte.

Assembly a = Assembly.LoadFrom("pathto\MyDll.dll"); 
foreach (Type t in a.GetTypes()) 
{ 
    Boolean isAssignableFrom = /* TODO INSERT TYPE CHECK */ 
    if (isAssignableFrom) 
    { 
     PluginBase plugin = (PluginBase) Activator.CreateInstance(t); 
     plugin.Initialize(); 
    } 
} 

Das Problem ist, dass ich es nicht bekommen kann die Art in der geladenen DLL mit der „gleichen“ Art in der Lösung i aus dem Projekt beginnen gefunden anzupassen.

hier ein aus dem Debugger in Bezug auf die „richtige“ Art und eingelegtem eines snipped:

+ t {Name = "Plugin" FullName = "...plugins.MyPlugin.Plugin"} System.Type {System.RuntimeType} 
+ t.BaseType {Name = "PluginBase" FullName = "...Plugin.PluginBase"} System.Type {System.RuntimeType} 
+ typeof(PluginBase) {Name = "PluginBase" FullName = "...Plugin.PluginBase"} System.Type {System.RuntimeType} 

Wie Sie sehen können, der Typ in der Baugruppe (Variable t) hat PluginBase als .BaseType gefunden.

Ich versuchte, die folgende Gleichheit überprüft, von denen alle false als Ergebnis zurückgegeben.

+ t is PluginBase 
+ t == typeof(PluginBase) 
+ typeof(PluginBase).IsAssignableFrom(t) 
+ t.BaseType is PluginBase 
+ t.BaseType == typeof(PluginBase) 
+ typeof(PluginBase).IsAssignableFrom(t.BaseType) 

Wenn ich den Scheck ignorieren und versuchen, eine Instanz zu erstellen, anstatt ich einen Followup-Fehler, wenn ich versuche, es zu werfen, geht die Ausnahmemeldung lautet wie folgt:

System.InvalidCastException: ' Kann nicht das Objekt vom Typ werfen ‚... plugins.MyPlugin.Plugin' eingeben‘ ... Plugin.PluginBase ‚‘

Eine Besetzung, die meiner Meinung nach funktionieren sollte.

Ich reinigte auch die gesamte Lösung und wieder aufgebaut alles, weil ich den Grund, dachte vielleicht eine veraltete .dll oder so ähnlich sein - es hat nicht geholfen.

Was fehlt mir?

+0

Stellen Sie sicher, dass Sie nicht versehentlich zwei separate Versionen von 'PluginBase' haben. Dies kann passieren, wenn Sie die Quelldatei in beide Projekte einbeziehen und nicht nur referenzieren. Der 'AssemblyQualifiedName' sollte dabei helfen. – Jester

+0

@Jester Ich habe den 'AssemblyQualifiedName' für den .dll-Typ und den Lösungstyp überprüft: ' + t.BaseType.AssemblyQualifiedName \t "... Plugin.PluginBase, ... Plugin, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null "' und '+ typeof (PluginBase). AssemblyQualifiedName \t" ... Plugin.PluginBase, ... Plugin, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = null "' Sie sind absolut identisch. Ich habe die Quelle nicht in beiden Projekten enthalten, sie verweisen nur auf das 'ProjectBase' Projekt. Dies hilft auch nicht beim Erstellen einer Instanz des Typs –

Antwort

0

Ordnung schaffte ich die Lösung in this post zu finden. Obwohl ich andere Beiträge überprüft habe, bevor ich meine Frage gestellt habe, bin ich immer noch nicht auf diese gekommen.

Dennoch ist die Lösung mit der gleichen DLL zu arbeiten.

Obwohl die DLL-Dateien identisch sind, denkt das Programm, dass es anders ist, weil es nicht an der gleichen Stelle ist.

Damit dies funktioniert, löschte ich einfach die DLL-Datei der Basisklasse im Build-Verzeichnis der abgeleiteten Klasse.

Für mich löste dies beide Probleme. Derjenige, der die Typen abgleicht und eine Instanz erstellt.