Ich bin mit dem folgenden Code ein paar Probleme mit:Type.IsSubclassOf() funktioniert nicht über AppDomains?
private class ClientPluginLoader : MarshalByRefObject
{
public bool IsPluginAssembly(string filename)
{
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomainReflectionOnlyAssemblyResolve);
Assembly asm = Assembly.ReflectionOnlyLoadFrom(filename);
Type[] types = asm.GetTypes();
foreach (Type type in types)
{
if (type.IsSubclassOf(typeof(ClientPlugin)))
{
return true;
}
}
return false;
}
}
Der Code wird über einen Proxy genannt, die ich durch meine benutzerdefinierte App Domain CreateInstanceFromAndUnwrap erstellt haben(). Dies bedeutet, dass IsPluginAssembly() im Kontext meiner benutzerdefinierten App-Domäne ausgeführt wird.
Das Problem ist, dass der Aufruf von IsSubclassOf() immer false zurückgibt, obwohl es IMHO True zurückgeben sollte. Der betreffende "Typ" erbt wirklich von ClientPlugin - daran besteht kein Zweifel.
ClientPlugin ist in einer anderen privaten Assembly definiert, die ich manuell auflöse, wie im obigen Codefragment ersichtlich ist.
type.BaseType == typeof(ClientPlugin)
Auf der anderen Seite ist dieser Ausdruck wahr:
type.BaseType.FullName == typeof(ClientPlugin).FullName
Wie ist das möglich
ich einen Haltepunkt auf der if (type.IsSubclassOf(...))
Linie und bestätigt diesen Ausdruck falsch sein gesetzt haben ? Was ist los?
UPDATE: Kent Boogaart wies mich in die richtige Richtung. Ich suchte das Web ein wenig mehr und lief in this Blogpost. Es scheint, dass ich meine Load/LoadFrom/ReflectionOnlyLoadFrom-Konflikte auflösen muss, damit dies funktioniert.
Ich hatte genau dieses Problem, ich hatte zwei Kopien der gleichen DLL in zwei Ordnern. Beim Ausführen der "IsSubclassOf" manuell, habe ich diese Fehlermeldung erhalten: Der Typ 'ServiceCore.BaseService' existiert sowohl in 'ServiceCore.dll' und 'ServiceCore.dll' – vpalmu