Verwenden verschiedener Versionen derselben Assembly im selben Ordner

Ich habe folgende Situation

Projekt A

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

Projekt B

  - Uses NHibernate - Uses Castle Windsor v2.1 

Im bin-Ordner von Project AI haben Sie die DLL Castle.DynamicProxy2.dll v2.2 und NHibernate dlls. Jetzt ist das Problem, dass NHibernate von Castle.DynamicProxy2.dll v2.1 abhängig ist, die nicht dort ist. Wie behebe ich diese Situation?

    Ich habe die folgende Konfiguration verwendet, um das Problem zu beheben.

                     

    Eine Sache sehr, sehr, sehr wichtig, die man verpassen könnte, wenn er nicht genug Aufmerksamkeit schenkt.

    Die Assembly, die Sie in das Tag der codeBase-Version schreiben, muss einen starken Namen haben.

    Von folgendem Link: http://msdn.microsoft.com/en-us/library/efs781xb.aspx

    Bei Assemblies ohne starken Namen wird die Version ignoriert, und der Loader verwendet das erste Erscheinungsbild von in . Wenn in der Anwendungskonfigurationsdatei ein Eintrag vorhanden ist, der die Bindung an eine andere Assembly umleitet, hat die Umleitung Vorrang, auch wenn die Assemblyversion nicht mit der Bindungsanforderung übereinstimmt.

    Eine Lösung (oder eine Problemumgehung) besteht darin, beide Versionen im globalen Assemblycache (GAC) auf den Computern zu installieren, auf denen die Software ausgeführt werden muss, und die Assemblys mit ihren starken Namen zu referenzieren. Dies setzt voraus, dass die Assemblies tatsächlich starke Namen haben.

    Die Installation in den GAC wird zu einem Problem, wenn Sie mehr als ein paar Entwickler haben oder wenn Sie Ihre Lösung auf vielen Computern bereitstellen möchten (z. B. als Endbenutzeranwendung). In diesem Fall glaube ich (aber ich könnte falsch liegen), dass Ihre einzige Option darin besteht, eine der beiden Versionen in die Assembly zu integrieren, die diese Version benötigt. In Ihrem speziellen Fall müssen Sie Castle.DynamicProxy2.dll v2.1 in NHibernate.dll .

    Sie können ein Tool namens ILMerge verwenden , um die Assemblys zusammenzuführen. Der Befehl, den Sie ausführen müssen, sieht ungefähr so ​​aus (ungetestet):

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

    Der /internalize internize-Schalter weist ILMerge an, alle Typen aus der zweiten Assembly (Castle in diesem Fall) internal in der Ausgabebaugruppe zu markieren. Ohne dies könnten beim Kompilieren eines Projekts, das sowohl auf Ihre neue NHibernate.dll als auch auf die Shelf-Version von Castle.DynamicProxy2.dll v2.2 Castle.DynamicProxy2.dll , Castle.DynamicProxy2.dll , da sie classn mit genau denselben Namen enthalten.

    Ich denke nicht, dass die Lösung von Hemanshu Bhojak eine gute Lösung ist, da Sie nicht zwei Versionen derselben Baugruppe in denselben Kontext laden möchten. Dieser Artikel erklärt warum:

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