Разрешение ссылки сборки.NET на другое имя?
Мой проект ссылается на Library1.dll и Library2.dll. Library2.dll зависит от Library1.dll, но он был скомпилирован для ссылки на него с другим именем Library1.Net40.dll.
Есть хороший способ сказать моему приложению перенаправить все ссылки на Library1.Net40.dll для разрешения в Library1.dll? Может быть, что-то похожее на способ перенаправления версий с помощью
У меня есть решение, которое обрабатывает событие AppDomain.AssemblyResolve, но это немного хак, и я надеюсь, что есть лучший способ сделать это.
Изменить: для чьей-либо справки, вот как я закончил решение с помощью события AppDomain.AssemblyResolve для перенаправления на другую сборку.
1 ответ
Вы пытались поиграть с элементом
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Library1.Net40"
publicKeyToken="..."
culture="neutral" />
<codeBase version="2.0.0.0"
href="Library1.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
(Не проверено; не знаю, работает ли это.)
CF: Я помещаю это обновление здесь, потому что это немного долго для комментариев:)
Хорошая идея, спасибо. У меня работает редирект, но он жалуется, потому что имена разные, вот журнал:
LOG: Попытка загрузки нового файла URL:///C:/Project/bin/Library1.dll. LOG: загрузка сборки прошла успешно. Попытка установки файла: C:\Project\bin\Library1.dll LOG: вход в фазу настройки кэша загрузки. LOG: имя сборки: Library1, версия =3.5.0.0, культура = нейтральная, PublicKeyToken=30ad4fe6b2a6aeed WRN: сравнение имени сборки привело к несоответствию: NAME ERR: ссылка на сборку не соответствует найденному определению сборки. ERR: установка не удалась с hr = 0x80131040. ERR: не удалось завершить настройку сборки (hr = 0x80131040). Зондирование прекращено.
Когда применяется ЧАСТИЧНОЕ разрешение, НАЗВАНИЕ УЗЛА должно совпадать с именем файла. Однако РАСПОЛОЖЕНИЕ файла может быть другим.
В противном случае журнал привязки Fusion сообщит "WRN: Сравнение имени сборки привело к несоответствию: NAME" и не сможет выполнить привязку.
(Хорошая новость: можно переименовать DLL сборки в соответствии с именем сборки.)
Например:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="6.0.0.0" />
<bindingRedirect oldVersion="11.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
<codeBase version="12.0.0.0" href="bin/Newtonsoft.Json.12/Newtonsoft.Json.dll" />
</dependentAssembly>
Это решает bin/Newtonsoft.Json.dll
а также bin/Newtonsoft.Json.12/Newtonsoft.Json.dll
в зависимости от версии (6-10 или 11-12 соответственно). ИМЯ успешно совпадает с именем файла, даже если путь к каталогу отличается.
NB "bin" сам по себе является частью href альтернативной версии; отрегулируйте соответствующим образом в зависимости от базы приложения, которая отличается от пути зонда. В случае about, который работает под IIS, база приложения находится на уровне выше директории корзины. (См. "LOG: Appbase = .." в журнале Fusion.)
К сожалению, процесс MSBuild не учитывает автоматически структуру каталогов ссылочных сборок, независимо от файлов конфигурации. Настройте проект, чтобы не "Копировать локально" альтернативные версии сборки, а затем скопируйте их как часть вторичного процесса, гарантируя сохранение правильной структуры. Если какая-либо скомпилированная сборка принимает альтернативную версию как прямую ссылку, было бы неплохо убедиться, что ни одна из них не является "Копировать локально" по умолчанию.