Переадресация привязки сборки: как и почему?
Это не проблемный вопрос, а общий вопрос о работе редиректа привязки сборки.
Запросы
- Почему при перенаправлении привязки отображаются только основные версии, а не второстепенные, номера сборки и ревизии?
Меняется ли старая и новая версия только при изменении основной версии?
<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)?
Я настоятельно рекомендую использовать dotPeek от JetBrains для просмотра библиотеки dll и ее версии. Согласно вашему второму вопросу. Версии могут быть совершенно разными, учитываются не только мажорные версии. введите сюда описание изображения