Ассемблирование переадресации: как и почему?

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

Запросы

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

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

Ответ 1

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

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

Ответ 2

Мы столкнулись с проблемой перенаправления привязки для 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

enter image description here

Ответ 3

У меня следующая ситуация: у меня есть проект web api, который ссылается на мои данные и бизнес-проект. И данные, и бизнес - это проект библиотеки классов. Проект данных ссылается на другую стороннюю библиотеку B, а также на библиотеку C версии 5.9.0.0. Библиотека B, в свою очередь, также ссылается на библиотеку C, но более высокой версии 6.0.0.0. Мой бизнес-проект использует стороннюю библиотеку X, которая использует библиотеку C версии 5.9.0.0. Я продолжаю получать не могу загрузить ошибку сборки для библиотеки c в проекте данных, где это необходимо. Я попытался поместить это сначала в web.config, но та же ошибка. Я поместил это только в проект данных, но все еще застрял в той же точке. Как мне загрузить их вместе? Я создал папки v0 и v1 в папке отладки проекта web api. Сначала они были в папке Bin web api, но теперь они находятся в режиме отладки.