AssemblyName.ReferenceMatchesDefinition如何工作?

时间:2010-03-22 17:36:30

标签: c# reflection assembly-resolution assembly-name

给出以下代码:

  var n1 = new AssemblyName ("TestDll, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089");
  var n2 = new AssemblyName ("TestDll, Version=2.0.0.2001, Culture=en-US, PublicKeyToken=ab7a5c561934e089");

  Console.WriteLine (AssemblyName.ReferenceMatchesDefinition (n1, n2));
  Console.WriteLine (AssemblyName.ReferenceMatchesDefinition (n2, n1));

为什么这两张支票都打印为“True”?我原以为AssemblyName.ReferenceMatchesDefinition应该考虑程序集名称的版本,文化和公钥标记属性的差异,不应该这些吗?

如果没有,ReferenceMatchesDefinition做的是简单名称的比较不是吗?

3 个答案:

答案 0 :(得分:4)

我在Microsoft Connect上报告了这个问题,并且已经确认了一个错误:

  

这确实是API中的一个错误。自从2.0 RTM引入以来,它一直在产品中。它从来没有正常工作。

     

[...]

     

您还可以考虑API AppDomain.ApplyPolicy(使用手动AssemblyName比较)。 API涵盖框架程序集统一和绑定重定向。   您还可以尝试覆盖非强名称程序集引用。当引用中不存在PublicKeyToken时,只会发生简单的名称匹配,其余的将被忽略。

答案 1 :(得分:2)

我认为张俊峰的这个blog post是相关的,尤其是他之前关于装配身份的博客文章。和往常一样,我不明白。祝你好运!

答案 2 :(得分:0)

只需检查msdn即可解决问题。

http://msdn.microsoft.com/en-us/library/system.reflection.assemblyname.referencematchesdefinition.aspx

准确地说:“返回一个值,指示加载程序是否将两个程序集名称解析为同一个程序集。”

显然,两个AssemblyNames最终都会解析为同一个程序集。