2013-07-30 10 views
10

enter image description heredwie wersje tego samego DLL w różnych projektach

Mam roztwór z wieloma projektami. Jest potrzeba, żebym musiał odnieść inną wersję tego samego zestawu w dwóch różnych projektach. Obecnie dzieje się tak, że tylko najnowsza wersja biblioteki dll jest kopiowana do folderu bin. Więc dll, który zależy od starszej wersji nie powiedzie się z powodu błędu

Could not load file or assembly xxxx or one of its dependencies. 
The located assembly's manifest definition does not match the 
assembly reference. 

Czy istnieje sposób, aby uzyskać aplikacji do korzystania z określonej wersji DLL oparty na projekcie?

+11

zapraszamy do DLL hell –

+0

Proszę podać więcej informacji, na których wykonywalne potrzeby, które DLL, w którym połączono wersję. Czy wszyscy są w tym samym katalogu? Czy możesz użyć regresji i pamięci podręcznej montażu? Mały przykład lub wykres pomoże bardzo pomóc w rozwiązaniu tego problemu. –

Odpowiedz

3

Tak, każdy odnośnik do projektu może mieć określoną wersję tej samej biblioteki dll. Sugerowałbym umieszczenie obu wersji biblioteki DLL w GAC. W projektach referencyjnych ustaw Copy Local = false i Specific Version = true.

Można to zrobić bez GAC, używając pliku konfiguracyjnego i assembly binding directives (ponieważ wspólne biblioteki dll nie mogą znajdować się w tym samym folderze, ponieważ mają taką samą nazwę), ale jest to jeden z głównych problemów, dla których zaprojektowano GAC rozwiązać. Dlatego polecam skorzystanie z niego.

+1

Należy wspomnieć, że GAC jest właściwym rozwiązaniem tylko wtedy, gdy zespoły mają silne nazwy (= są podpisane). – Vadim

+0

Użyłem dyrektywy wiążącej montaż. To zadziałało :) – developer747

+0

@ developer747: Aby wyjaśnić, mówiłem o dyrektywach konfiguracyjnych takich jak Probing (http://msdn.microsoft.com/en-us/library/4191fzwb.aspx). Nie mówiłem o używaniu bindingRedirect, ponieważ to nie rozwiązałoby twojego problemu. bindingRedirect spowodowałoby, że oba twoje złoenia używałyby tej samej wersji współużytkowanej biblioteki dll nie w różnych wersjach, jak ci podałeś. –

0

W zależności od odbiorców (jeśli jest to aplikacja serwerowa, witryna internetowa, aplikacja dla jednego użytkownika, aplikacja komputerowa dla wielu użytkowników itp.), Być może uda się trochę oszukać i hostować jedną wersję w całkowicie oddzielna domena aplikacji, np. usługa internetowa lub usługa WCF.

Na przykład, zakładając, że projekt jest aplikacją internetową:

MyWebApplication 
    - DLL reference to MyLibrary v1.0 
    - Only have internal references which use v1.0 of the library 
    - WCF proxy to http://localhost/MyWebService 

MyWebService 
    - DLL reference to MyLibrary v2.0 
    - Only have internal references which use v2.0 of the library 
+2

Przepraszam, czy przeczytałeś pytanie? – Alex

+1

@Alex Pytanie nie rozróżnia odbiorców tej aplikacji - jeśli jest to aplikacja internetowa i są oni w stanie dodać usługę WCF, to rozwiązanie zadziała - musiałem to zrobić w tym celu dokładnie jeden raz. Być może trzeba będzie przetasować kilka klas, być może wygenerować niektóre opakowania usługi, ale jest to zdecydowanie potencjalne rozwiązanie, zachowując kod, który potrzebuje jednej wersji w domenie usługi, i kod, który potrzebuje innej wersji w domenie usługi. Aplikacja internetowa. GAC jest potencjalnie lepszy w zależności od scenariusza, ale to tylko kolejna alternatywa. –

Powiązane problemy