我在以下代码中遇到了一些问题:
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;
}
}
这段代码是通过我创建的代理调用的,代理是通过我的自定义应用程序域的CreateInstanceFromAndUnwrap()方法创建的。这意味着IsPluginAssembly()在我的自定义应用程序域的上下文中执行。
问题在于,尽管在我的看法中应该返回true,但IsSubclassOf()调用始终返回false。毫无疑问,“type”确实从ClientPlugin派生出来。
ClientPlugin在另一个私有程序集中定义,我正在手动解析它,就像上面的代码片段所示。
我已经在if (type.IsSubclassOf(...))
行上设置了断点,并确认了这个表达式为false:
type.BaseType == typeof(ClientPlugin)
另一方面,这个表达式是正确的:
type.BaseType.FullName == typeof(ClientPlugin).FullName
这怎么可能?发生了什么?
更新:Kent Boogaart指引我朝正确方向前进。我在网上搜索了一些信息,并发现这篇博客文章。看起来我需要解决我的Load/LoadFrom/ReflectionOnlyLoadFrom冲突,才能使这个工作正常运作。