Использование разных версий одной и той же сборки в одной папке

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

Проект А

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

Проект B

  - Uses NHibernate - Uses Castle Windsor v2.1 

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

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

                     

    Одна вещь очень, очень, очень важная, что можно пропустить, если он не уделяет достаточного внимания.

    Сборка, которую вы пишете в теге версии codeBase, должна быть сильной.

    По следующей ссылке: http://msdn.microsoft.com/en-us/library/efs781xb.aspx

    Для сборок без сильного имени версия игнорируется, и загрузчик использует первый вид внутри . Если в файле конфигурации приложения есть запись, которая перенаправляет привязку к другой сборке, redirect будет иметь приоритет, даже если версия сборки не соответствует запросу привязки.

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

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

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

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

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

    Я не думаю, что решение Hemanshu Bhojak является хорошим, так как вы не хотите загружать две версии одной и той же сборки в один и тот же контекст. В этой статье объясняется, почему:

    http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions

    Interesting Posts
    Давайте будем гением компьютера.