Ich arbeite an einem Plugin-System, das .dll's in einem angegebenen Ordner lädt. Ich benutze dann Reflektion, um die Assemblys zu laden, iteriere durch die Typen, die sie enthalten, und identifiziere alle, die meine IPlugin
Schnittstelle implementieren.IsAssignableFrom() gibt false zurück, wenn es true zurückgeben soll
ich dies mit Code bin Überprüfung ähnlich der folgenden:
foreach(Type t in myTypes)
{
if(typeof(IPlugin).IsAssignableFrom(t))
{
...
}
}
Aus irgendeinem Grund IsAssignableFrom() hält false zurückgibt, wenn es wahr zurückkehren sollte. Ich habe versucht, das t
zu ersetzen, indem ich ihm ausdrücklich einen Typ gebe, der übergeben werden sollte, und es funktioniert gut, aber aus irgendeinem Grund arbeitet es nicht mit den Typen, die von der geladenen Assembly zurückgegeben werden. Um etwas merkwürdiger zu machen, funktioniert der Code auf der Maschine meines Kollegen, aber nicht auf meiner.
Weiß jemand etwas, das diese Art von Verhalten verursachen könnte?
Dank
In meinem Fall schlägt Typvergleich nur bei einer Schnittstelle fehl und es funktioniert gut für alle anderen Schnittstellen, die in derselben Baugruppe definiert sind! Warum sollte das passieren? Die Assembly, die die Schnittstelle enthält, wird mithilfe des Post-Build-Ereignisses des Projekts in den Ordner "bin \ debug" der Anwendung kopiert. Ich denke also, dass die Assembly, auf die in meinem Startprojekt verwiesen wird (unter Verwendung der direkten Projektreferenz), dieselbe ist wie die, die im Ordner "bin \ debug" der Anwendung kopiert wurde. Ist das nicht der Fall? – Learner
Das war es für mich. Mein Modul hat die Version 2.0.0.0 der Assembly, die den Typ enthält, den ich überprüft habe, refecten, während der implementierende Typ einen Typ mit demselben Namen aus Version 2.1.0.0 dieser Assembly implementiert hat. –
Es scheint mir, dass dies fehlschlägt, wenn die Assemblys in einen reinen Reflektionskontext geladen werden. Auch wenn beide Typen den gleichen * AssemblyQualifiedName * haben. –