У меня есть следующая ситуация
Проект 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, который не является там. Как я разрешаю эту ситуацию.
Я использовал следующую конфигурацию для решения проблемы.
<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>
Одним из решений (или обходным путем) будет установка обеих версий в 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, поскольку они будут содержать классы с одинаковыми именами.