2012-04-16 14 views
5

Mam plik EXE odwołujący się do biblioteki DLL - w tym przykładzie nazwę to: TestDLL.dll.
EXE jest napisane w języku C#, a biblioteka DLL jest zapisana w VB .Net.Wiązanie i przekierowanie wiązania

Utworzyłem wersję zestawu biblioteki demo - na przykład - TestDLL.dll wersja 1.0.0.0.
Chcę skompilować EXE w odniesieniu do wersji demo DLL (1.0.0.0). Następnie - chcę, aby EXE korzystał z tej samej biblioteki DLL, ale tej, którą umieściłem w GAC dowolnej wersji.
Aby to zrobić, należy ustawić "Copy Local" własność referencyjne DLL do FAŁSZ.

Moim celem jest na przykład - po kompilacji wstawię GAC TestDLL.dll z wersją montażową 2.1.6.0, a EXE odnajdzie go za pomocą powiązania przekierowania zespołu. Do tego użyłem pliku konfiguracyjnego. Kiedyś ten link, aby go utworzyć:
http://msdn.microsoft.com/en-us/library/7wd6ex19(v=vs.71).aspx

Więc mój plik config wygląda o tak:

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="myAssembly" 
          publicKeyToken="32ab4ba45e0a69a1" 
          culture="en-us" /> 
     <!-- Assembly versions can be redirected in application, publisher policy, or machine configuration files. --> 
     <bindingRedirect oldVersion="1.0.0.0" 
          newVersion="2.1.6.0"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Problem polega na tym, że po zrobieniu tego wszystkiego, ja uruchomić EXE i podczas dostępu do biblioteki dll, Wystąpił słynny błąd: System.IO.FileNotFoundException: Nie można załadować pliku lub zespołu 'TestDLL, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 9d8162944bd6fdc7' lub jednej z jego zależności. System nie może odnaleźć określonego pliku. File name: 'TestDLL, Version = 1.0.0.0, Culture = neutral, TokenKluczaPublicznego = 9d8162944bd6fdc7'

znaczenie, EXE nie może znaleźć oryginalne DLL I odwołuje się. Wiem, że mogę po prostu "odwołać się" do GAC lub użyć odbicia, ale nie chcę - ponieważ ten EXE ma działać tylko w ten sposób.

Czy ktoś wie, na czym polega problem i jak go naprawić?
Dzięki

+0

Czy ustawiono właściwość "Specific Version" odwołania na wartość false? –

+0

Czy możesz opublikować plik .config? – Xharze

+0

Oczywiście ustawiłem także właściwość "Specific Version" odwołania na wartość false. –

Odpowiedz

11

Upewnij się, że ustawiłeś właściwą publicKeyToken. W kodzie, który pokazałeś, używasz publicKeyToken="32ab4ba45e0a69a1", który jest tokenem klucza publicznego z łącza MSDN. Oczywiście jest to znacznik klucza publicznego twojego zespołu. Aby to działało, musisz mieć oba zestawy (1.0.0.0 i 2.1.6.0) podpisane tym samym kluczem. Aby wyodrębnić klucza tokenu publicznego można użyć narzędzia sn.exe lub spojrzał na ślad stosu wyjątku otrzymujesz (jest informacją, że publicKeyToken="9d8162944bd6fdc7"):

sn.exe -Tp myassembly.dll 

Ale jeśli zespół, że program został skompilowany przeciw nie było podpisane tym samym kluczem, to nie zadziała.

Widzę również, że ustawiłeś culture="en-us", ale czy Twój zespół używa tej kultury? Możesz także spróbować culture="Neutral".

Na koniec upewnij się, że zainstalowałeś odpowiednią wersję zestawu w GAC.

+1

To wystarczy. Kultura też nie jest poprawna. –