Как работает AssemblyName.ReferenceMatchesDefinition? - PullRequest
3 голосов
/ 22 марта 2010

С учетом следующего кода:

  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 ]

4 голосов
/ 07 августа 2012

Я сообщил о проблеме на Microsoft Connect , и была подтверждена ошибка:

Это действительно ошибка в API. Это было в продукте, так как это было введено в 2.0 RTM. Он никогда не работал должным образом.

[...]

Вы также можете рассмотреть API AppDomain.ApplyPolicy (при сравнении AssemblyName вручную). API охватывает унификацию сборки Framework и перенаправления привязки. Вы также можете попытаться охватить ссылки на сборку не строгих имен. Когда PublicKeyToken отсутствует в ссылке, происходит только простое сопоставление имен, остальное игнорируется.

2 голосов
/ 22 марта 2010

Я думаю, что это сообщение в блоге от Junfeng Zhang имеет отношение к делу, особенно к более раннему сообщению в блоге, на которое он ссылается об идентификации сборки.Как обычно с ним, я ничего не понимаю.Удачи!

0 голосов
/ 22 марта 2010

просто проверка msdn решила бы проблему.

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

Точно: «Возвращает значение, указывающее, разрешает ли загрузчик два имени сборки в одну и ту же сборку.»

По-видимому, оба AssemblyNames в конечном итоге преобразуются в одну и ту же сборку.

...