我在使用以下代码时遇到了一些问题:
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() 在我的自定义应用程序域的上下文中执行。
问题是对 IsSubclassOf() 的调用总是返回 false,即使恕我直言它应该返回 true。有问题的“类型”确实继承自 ClientPlugin - 毫无疑问。
ClientPlugin 是在另一个私有程序集中定义的,我正在手动解析它,如上面的代码片段所示。
我if (type.IsSubclassOf(...))
在行上放了一个断点并确认这个表达式是错误的:
type.BaseType == typeof(ClientPlugin)
另一方面,这个表达式是真的:
type.BaseType.FullName == typeof(ClientPlugin).FullName
这怎么可能?这是怎么回事?
更新:Kent Boogaart 为我指明了正确的方向。我在网上搜索了更多,然后遇到了这篇博文。看来我必须解决我的 Load/LoadFrom/ReflectionOnlyLoadFrom 冲突才能完成这项工作。