Переадресация привязки сборки: как и почему?

Это не проблемный вопрос, а общий вопрос о работе редиректа привязки сборки.

Запросы

  1. Почему при перенаправлении привязки отображаются только основные версии, а не второстепенные, номера сборки и ревизии?
  2. Меняется ли старая и новая версия только при изменении основной версии?

    <dependentAssembly>
        <assemblyIdentity name="FooBar"  
                          publicKeyToken="32ab4ba45e0a69a1"  
                          culture="en-us" />  
    
        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />  
    </dependentAssembly>
    

3 ответа

Решение

Зачем нужны обязательные перенаправления? Предположим, у вас есть приложение A, которое ссылается на библиотеку B, а также библиотеку C версии 1.1.2.5. Библиотека B, в свою очередь, также ссылается на библиотеку C, но версии 1.1.1.0. Теперь у нас конфликт, потому что вы не можете загружать разные версии одной и той же сборки во время выполнения. Чтобы разрешить этот конфликт, вы можете использовать привязку перенаправления, обычно к новой версии (но может быть и к старой). Это можно сделать, добавив следующее в файл app.config приложения A в разделе configuration > runtime > assemblyBinding раздел (см. пример полного конфигурационного файла):

<dependentAssembly>
    <assemblyIdentity name="C"  
                      publicKeyToken="32ab4ba45e0a69a1"  
                      culture="en-us" />  

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5 />  
</dependentAssembly>

Вы также можете указать диапазон версий для сопоставления:

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5 />  

Теперь библиотека B, которая была скомпилирована со ссылкой на C версии 1.1.1.0, будет использовать C версии 1.1.2.5 во время выполнения. Конечно, вам лучше убедиться, что библиотека C обратно совместима, иначе это может привести к неожиданным результатам.

Вы можете перенаправить любые версии библиотек, не только основные.

Мы столкнулись с проблемой с перенаправлением привязки для NewtonSoft.Json. Мы посмотрели версию файла в свойствах файла win 10 "9.0.1.19813", посмотрели номер и перенаправление продолжало давать сбой. Дальнейшее расследование и обнаружило, что мы искали версию файла, а не версию сборки. Итак, мне интересно, если люди ошибаются в версии файла (которая часто меняется) и версии сборки (которую вы не видите в Windows 10 File Explorer). Чтобы увидеть сборочную версию DLL, вы можете запустить ее в powershell. Замените имя DLL на то, для которого вы хотите найти версию.

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

Результат выше есть.

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

Смотрите ссылки:

Как посмотреть версию сборки.NET в Windows Vista и более поздних версиях (WIndows 7, 2008)?

https://support.microsoft.com/en-nz/help/556041

Я настоятельно рекомендую использовать dotPeek от JetBrains для просмотра библиотеки dll и ее версии. Согласно вашему второму вопросу. Версии могут быть совершенно разными, учитываются не только мажорные версии. введите сюда описание изображения

Другие вопросы по тегам