3

给定以下代码:

  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 做了哪些简单名称的比较没有做的事情?

4

3 回答 3

4

我已在Microsoft Connect上报告了该问题,并且已确认存在错误:

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

[...]

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

于 2012-08-07T13:17:08.467 回答
2

我认为张俊峰的这篇博文是相关的,尤其是他之前链接到的关于装配体身份的博文。像往常一样,我什么都不懂。祝你好运!

于 2010-03-22T19:13:09.617 回答
0

只需检查 msdn 就可以解决问题。

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

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

显然,两个 AssemblyNames 最终都解析为同一个 Assembly。

于 2010-03-22T17:39:39.400 回答