AssemblyName.ReferenceMatchesDefinition 如何工作?

Fab*_*ied 4 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));
Run Code Online (Sandbox Code Playgroud)

为什么这两个检查都打印“True”?我本以为 AssemblyName.ReferenceMatchesDefinition 应该考虑程序集名称的版本、区域性和公钥标记属性的差异,不是吗?

如果没有,ReferenceMatchesDefinition 能做什么而简单名称的比较却不能做什么?

Fab*_*ied 5

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

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

[...]

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