C# AssemblyName.ReferenceMatchesDefinition如何工作?

C# AssemblyName.ReferenceMatchesDefinition如何工作?,c#,reflection,assembly-resolution,assembly-name,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 (Ass

给定以下代码:

  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”?我想,CalpNyMe.RealEngEtCaseDebug应该考虑程序集名称的版本、区域性和公钥令牌属性的差异,不是吗?


如果没有,那么ReferenceMatchesDefinition做了什么,而简单名称的比较没有做什么?

只要检查msdn就可以解决问题

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


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

我认为张俊峰的这篇文章是相关的,特别是他之前链接到的关于程序集身份的博客文章。和往常一样,我一点也不懂。祝你好运

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

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

[……]

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


我查过文件了,谢谢。我知道这两个名称“解析到同一个程序集”(就ReferenceMatchesDefinition而言),但我不知道这是怎么回事。文档说:“引用和定义都由加载程序解析,包括策略评估,然后测试定义是否与引用相等。”我看不出这两个名称如何被视为相等。谢谢,下面是相关文本:当且仅当ReferenceIdentity中指定的所有属性的值与DefinitionIdentity的相应属性的值匹配时,ReferenceIdentity才与DefinitionIdentity匹配。如果ReferenceIdentity中缺少某个属性,则该属性将与DefinitionIdentity中该属性的任何值匹配。例如,Ref“name”匹配Def“name,culture=neutral”和Def“name,culture=en-us”。但是Ref“name,culture=neutral”与Def“name,culture=en-us”不匹配。“在CLR中,我们有另一个特殊的比较——用于Ref-Def匹配的绑定比较。”。在特殊绑定比较上下文中,当ReferenceIdentity不包含任何公钥(令牌)时,版本号将被忽略。“但是,我看不出上面给出的版本如何匹配。我同意。CLR使用IAssemblyName::IsEqual()如果有帮助,请使用ASM_CMPF_IL_ALL标志。Ref Def匹配对我来说唯一有意义的方法是当CLR探测不在GAC中的程序集时进行的匹配。但这应该很简单,只是显示名称匹配。