Usando diferentes versões do mesmo assembly na mesma pasta

Eu tenho a seguinte situação

Projeto A

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

Projeto B

  - Uses NHibernate - Uses Castle Windsor v2.1 

Na pasta bin do Project AI tem as dll Castle.DynamicProxy2.dll v2.2 e NHibernate dlls. Agora o problema é que o NHibernate depende do Castle.DynamicProxy2.dll v2.1 que não está lá. Como resolvo esta situação?

    Eu usei a seguinte configuração para resolver o problema.

                     

    Uma coisa muito, muito, muito importante que se pode perder se ele não está prestando atenção suficiente.

    A assembly que você escreve na tag de versão codeBase, deve ter um nome forte.

    No link a seguir: http://msdn.microsoft.com/pt-br/library/efs781xb.aspx

    Para montagens sem um nome forte, a versão é ignorada e o carregador usa a primeira aparência de dentro de . Se houver uma input no arquivo de configuração do aplicativo que redireciona a binding para outro assembly, o redirecionamento terá precedência, mesmo se a versão do assembly não corresponder à solicitação de binding.

    Uma solução (ou solução alternativa) seria instalar as duas versões no Global Assembly Cache (GAC) na (s) máquina (s) nas quais o seu software precisa ser executado e fazer referência aos assemblies usando seus nomes fortes. Isso pressupõe que os assemblies realmente têm nomes fortes.

    Instalar no GAC será um problema se você tiver mais do que alguns desenvolvedores ou se planejar implantar sua solução em muitos computadores (por exemplo, como um aplicativo de usuário final). Nesse caso, acredito (mas posso estar errado) que sua única opção é mesclar uma das duas versões no assembly que requer essa versão. No seu caso específico, você precisa do Castle.DynamicProxy2.dll v2.1 para ser mesclado no NHibernate.dll .

    Você pode usar uma ferramenta chamada ILMerge para mesclar os assemblies. O comando que você precisa para executar é algo como isto (não testado):

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

    A opção /internalize diz ao ILMerge para marcar todos os tipos da segunda assembly (Castle neste caso) internal no conjunto de saída. Sem isso, você pode obter erros de compilation ao tentar compilar um projeto referenciando seu novo NHibernate.dll e a versão de prateleira do Castle.DynamicProxy2.dll v2.2, pois eles conterão classs com os mesmos nomes.

    Eu não acho que a solução da Hemanshu Bhojak seja boa, já que você não quer carregar duas versões da mesma assembly no mesmo contexto. Este artigo explica por que:

    http://msdn.microsoft.com/pt-br/library/dd153782.aspx#avoid_loading_multiple_versions