Разрешение ссылки сборки.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 не учитывает автоматически структуру каталогов ссылочных сборок, независимо от файлов конфигурации. Настройте проект, чтобы не "Копировать локально" альтернативные версии сборки, а затем скопируйте их как часть вторичного процесса, гарантируя сохранение правильной структуры. Если какая-либо скомпилированная сборка принимает альтернативную версию как прямую ссылку, было бы неплохо убедиться, что ни одна из них не является "Копировать локально" по умолчанию.

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