Ассемблирование переадресации: как и почему?
Это не проблема, а общий вопрос о необходимости переадресации сборки.
Запросы
- Почему привязка переадресации показывает только основную версию, а не незначительные, строковые и ревизионные номера?
-
Изменяется ли старая и новая версия только при изменении основной версии?
<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, но теперь они находятся в режиме отладки.