我在使用以下代码时遇到了一些问题:
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(…))行上设置了一个断点,并确认该表达式为false:
type.BaseType == typeof(ClientPlugin)
另一方面,这个表达式是正确的:
type.BaseType.FullName == typeof(ClientPlugin).FullName
这怎么可能?这是怎么回事?
更新:Kent Boogaart向我指出了正确的方向.我在网上搜索了一下,然后进入this博客文章.我似乎必须解决我的Load / LoadFrom / ReflectionOnlyLoadFrom冲突才能使其工作.
解决方法
这是由于加载到不同的上下文.加载程序集的方式(Load / LoadFrom / ReflectionOnlyLoad)确定加载程序集的上下文.这个简单的例子也证明了这个问题:
using System; using System.Reflection; class Foo { public static void Main() { var type = typeof(Foo); var reflectionLoadType = Assembly.ReflectionOnlyLoad("ConsoleApplication1").GetType("Foo"); Console.WriteLine(type == reflectionLoadType); //false Console.WriteLine(type.Equals(reflectionLoadType)); //false Console.WriteLine("DONE"); Console.ReadKey(); } }
有关详细信息,请参阅here.
原文地址:https://www.jb51.cc/csharp/92004.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。