我正在尝试调试一些使用反射来加载插件的代码
这是调试代码:
Type a = methodInfo.GetParameters()[0]
.ParameterType.BaseType;
Type b = typeof(MessageContext);
Debug.WriteLine(a.AssemblyQualifiedName);
Debug.WriteLine(b.AssemblyQualifiedName);
Debug.WriteLine(a.Equals(b));
这是它的输出:
OrtzIRC.Common.MessageContext,OrtzIRC.Common,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null
OrtzIRC.Common.MessageContext,OrtzIRC.Common,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null
假
我不明白是什么让这两种类型不同?
答案 0 :(得分:17)
由不同应用程序域[.NET]或类加载器[Java]加载的相同类/类型将不会相等,并且不能直接相互分配。
您可能有两个包含该类型的DLL副本 - 一个由主程序加载,另一个由Assembly.Load*(...)
方法加载?
尝试显示/比较属性:
a.Assembly.Equals(b.Assembly)
和
a.Assembly.Location.Equals(b.Assembly.Location)
通常,您只需要每个DLL的一个副本,并将其加载到单个应用程序域中。
答案 1 :(得分:3)
如果从程序集的不同版本加载两种类型,则会发生这种情况。 .NET认为它们是不同的,不相关的类型。检查
Debug.WriteLine (a.AssemblyQualifiedName) ;
Debug.WriteLine (b.AssemblyQualifiedName) ;
答案 2 :(得分:0)
答案 3 :(得分:0)
尝试:Debug.Writeline(a.Equals(b));