【问题标题】:Two Types not equal that should be两种不相等的类型应该是
【发布时间】:2010-09-02 02:01:32
【问题描述】:

我正在尝试调试一些使用反射加载插件的代码

调试代码如下:

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、版本=1.0.0.0、文化=中性、PublicKeyToken=null
OrtzIRC.Common.MessageContext,OrtzIRC.Common,版本=1.0.0.0,文化=中性,PublicKeyToken=null
假的

我不明白这两种类型有何不同?

【问题讨论】:

  • .UnderlyingSystemType 对他们俩的回报是什么?
  • 好吧。它们是由不同的类加载器加载的吗?
  • 我的意思是,您是否有一个小的独立可运行样本可供我们测试?

标签: c# .net reflection


【解决方案1】:

不同应用程序域 [.NET] 或类加载器 [Java] 加载的相同类/类型不会比较相等,也不能直接相互分配。

您可能有两个包含该类型的 DLL 副本 - 一个由主程序加载,另一个由 Assembly.Load*(...) 方法之一加载?

尝试显示/比较属性:
a.Assembly.Equals(b.Assembly)

a.Assembly.Location.Equals(b.Assembly.Location)

通常,您只需要每个 DLL 的一个副本并将其加载到单个应用程序域中。

【讨论】:

  • 你是对的,它正在加载同一个程序集的两个副本。其中一个被复制到插件目录,所以我猜插件正在加载那个,而不是已经在应用程序域中的那个。所以我只是删除了程序集并关闭了“复制本地”并且它起作用了。谢谢!
  • 我有一个类似(如果不相同)的问题。我注意到尽管在不同的应用程序域中,Assembly.Load* 函数成功地检查了类型相等,但 Assembly.ReflectionOnlyLoad* 函数失败了。如果您能查看我的问题,我将不胜感激:stackoverflow.com/q/40292593/975724
  • 你帮我找到了问题。我的插件有一个从插件目录加载的类型。我将它与从临时 ASP.NET 文件加载的同一 dll 中的类型进行比较。不过,我还不知道如何解决这个问题。我需要让 Temporary ASP.NET Files 版本消失。
【解决方案2】:

如果这两种类型是从不同版本的程序集加载的,就会发生这种情况。 .NET 将它们视为不同的、不相关的类型。检查

Debug.WriteLine (a.AssemblyQualifiedName) ;
Debug.WriteLine (b.AssemblyQualifiedName) ;

【讨论】:

  • 两者完全相同,版本相同。
  • 那么它可能是程序集加载器上下文:typeof() 程序集加载到默认上下文中,但 Assembly.LoadFrom() 和朋友加载到 LoadFrom 上下文中。你再次得到不同的类型。解决方法是在LoadFrom()'ing 之前检查程序集是否已经加载到 appdomain 中。
  • 确保在开始加载引用此程序集的插件之前将 OrtzIRC.Common 加载到默认上下文中(typeof(MessageContext) 应该这样做)。
【解决方案3】:

试试:Debug.Writeline(a.Equals(b));

【讨论】:

    【解决方案4】:

    这是你应该如何比较类型:

    C# Object Type Comparison

    我认为您的问题在于类型层次结构...

    【讨论】:

      猜你喜欢
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 2019-11-30
      • 1970-01-01
      • 2019-05-19
      • 2011-08-29
      • 1970-01-01
      相关资源
      最近更新 更多