Używanie różnych wersji tego samego złożenia w tym samym folderze

Mam następującą sytuację

Projekt A

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

Projekt B

 - Uses NHibernate
 - Uses Castle Windsor v2.1

W folderze bin projektu a mam zamek dll.DynamicProxy2.dll v2.2 i biblioteki DLL NHibernate. Teraz problem polega na tym, że NHibernate jest zależny od Castle ' a.DynamicProxy2.dll v2. 1, którego nie ma. Jak mam rozwiązać tę sytuację.

Author: Kirill Kobelev, 2010-03-17

4 answers

Użyłem poniższej konfiguracji, aby rozwiązać problem.

<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>
 88
Author: Hemanshu Bhojak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-17 11:20:02

Jedna bardzo, bardzo, bardzo ważna rzecz, którą można przegapić, jeśli nie zwraca wystarczającej uwagi.

Zespół, który piszesz w znaczniku wersji bazy kodowej, musi mieć silną nazwę.

Z poniższego linku: http://msdn.microsoft.com/en-us/library/efs781xb.aspx

Dla zestawów bez silnej nazwy, wersja jest ignorowana i loader używa pierwszego wyglądu wewnątrz . Jeśli jest wpis w zastosowanie plik konfiguracyjny, który przekierowuje Wiązanie do innego zestawu, przekierowanie będzie miało pierwszeństwo nawet jeśli Wersja assembly Nie dopasuj żądanie wiązania.

 9
Author: Lauro Wolff Valente Sobrinho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-22 20:32:19

Jednym z rozwiązań (lub obejścia) byłoby zainstalowanie obu wersji w Global Assembly Cache (GAC) na maszynie(maszynach), na której oprogramowanie ma działać, i odwoływanie się do zestawów używając ich silnych nazw. Zakłada to, że zgromadzenia rzeczywiście mają silne nazwy.

Instalacja w GAC będzie uciążliwa, jeśli masz więcej niż kilku programistów lub jeśli planujesz wdrożyć swoje rozwiązanie na wielu komputerach (np. jako aplikację użytkownika końcowego). W tym przypadku wierzę (ale ja może się mylić), że jedyną opcją jest scalenie jednej z dwóch wersji do zestawu wymagającego tej wersji. W twoim konkretnym przypadku, musisz Castle.DynamicProxy2.dll v2.1 połączyć w NHibernate.dll.

Możesz użyć narzędzia o nazwie ILMerge do scalania zestawów. Polecenie, które będziesz musiał uruchomić, wygląda mniej więcej tak (niesprawdzone):

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

Przełącznik /internalize mówi ILMerge, aby oznaczał wszystkie typy z drugiego zestawu (w tym przypadku Castle) internal w zestawie wyjściowym. Bez tego, możesz uzyskać błędy kompilacji, gdy spróbujesz skompilować projekt odwołujący się zarówno do twojej nowej NHibernate.dll, jak i wersji półkowej Castle.DynamicProxy2.dll v2. 2, ponieważ będą one zawierać klasy o dokładnie tych samych nazwach.

 8
Author: Jørn Schou-Rode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-17 08:11:36

Myślę, że rozwiązanie Hemanshu Bhojak nie jest dobre, ponieważ nie chcesz załadować dwóch wersji tego samego zestawu w tym samym kontekście. Ten artykuł wyjaśnia dlaczego:

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

 2
Author: Jonathan Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-18 06:13:50