Используя различные версии того же блока в той же папке

У меня есть следующая ситуация

Проект A

 - Uses Castle Windsor v2.2
 - Uses Project B via WindsorContainer

Проект B

 - Uses NHibernate
 - Uses Castle Windsor v2.1

В папке мусорного ведра Проекта A у меня есть dll Castle.DynamicProxy2.dll v2.2 и NHibernate dlls. Теперь проблема состоит в том, что NHibernate зависит от Castle.DynamicProxy2.dll v2.1, который не является там. Как я разрешаю эту ситуацию.

63
задан Kirill Kobelev 13 July 2017 в 03:53
поделиться

2 ответа

Я использовал следующую конфигурацию для решения проблемы.

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Castle.DynamicProxy2" publicKeyToken="407dd0808d44fbdc" />
                <codeBase version="2.1.0.0" href="v2.1\Castle.DynamicProxy2.dll" />
                <codeBase version="2.2.0.0" href="v2.2\Castle.DynamicProxy2.dll" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" />
                <codeBase version="1.1.0.0" href="v2.1\Castle.Core.dll" />
                <codeBase version="1.2.0.0" href="v2.2\Castle.Core.dll" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>
91
ответ дан 24 November 2019 в 16:21
поделиться

Одним из решений (или обходным путем) будет установка обеих версий в Global Assembly Cache (GAC) на машине (машинах), на которой должно работать ваше программное обеспечение, и обращение к сборкам с использованием их сильных имен. Это предполагает, что сборки действительно имеют сильные имена.

Установка в GAC станет проблемой, если у вас больше нескольких разработчиков или если вы планируете развернуть свое решение на многих компьютерах (например, в качестве приложения для конечного пользователя). В этом случае, я считаю (но могу ошибаться), что единственным вариантом является объединение одной из двух версий в сборку, требующую эту версию. В вашем конкретном случае вам нужно Castle.DynamicProxy2.dll v2.1 объединить в NHibernate.dll.

Вы можете использовать инструмент под названием ILMerge для объединения сборок. Команда, которую вам нужно будет выполнить, выглядит примерно так (не проверено):

ILMerge /t:library /internalize /out:Deploy/NHibernate.dll
    NHibernate.dll Castle.DynamicProxy2.dll

Переключатель /internalize указывает ILMerge отметить все типы из второй сборки (Castle в данном случае) internal в выходной сборке. Без этого вы можете получить ошибки компиляции при попытке скомпилировать проект, ссылающийся как на ваш новый NHibernate.dll, так и на полковую версию Castle.DynamicProxy2.dll v2.2, поскольку они будут содержать классы с одинаковыми именами.

9
ответ дан 24 November 2019 в 16:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: