Przekierowanie powiązania zestawu: jak i dlaczego?


127

To nie jest problematyczne pytanie, ale ogólne pytanie dotyczące działania przekierowania powiązań asemblera.

Zapytania

  1. Dlaczego przekierowanie powiązania pokazuje tylko wersję główną, a nie numery drugorzędne, kompilacji i poprawki?
  2. Czy stara i nowa wersja zmienia się tylko wtedy, gdy następuje zmiana w wersji głównej?

    <dependentAssembly>
        <assemblyIdentity name="FooBar"  
                          publicKeyToken="32ab4ba45e0a69a1"  
                          culture="en-us" />  
    
        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />  
    </dependentAssembly>

Może to być dowolna wersja, nie tylko główna. Na przykład:oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"
Evk

@Evk: Wszystkie przykłady, które widziałem, pokazują tylko wersję główną.
Nikhil Agrawal

4
Cóż, to tylko przykłady i nigdzie nie jest powiedziane, że to jedyny możliwy sposób.
Evk

Odpowiedzi:


166

Dlaczego w ogóle potrzebne są wiążące przekierowania? Załóżmy, że masz aplikację A, która odwołuje się do biblioteki B, a także do biblioteki C w wersji 1.1.2.5. Biblioteka B z kolei odwołuje się do biblioteki C, ale w wersji 1.1.1.0. Teraz mamy konflikt, ponieważ nie można załadować różnych wersji tego samego zestawu w czasie wykonywania. Aby rozwiązać ten konflikt, możesz użyć przekierowania wiązania, zwykle do nowej wersji (ale może też być do starej). Robisz to, dodając do pliku app.config aplikacji A, w configuration > runtime > assemblyBindingsekcji (zobacz tutaj przykład pełnego pliku konfiguracyjnego):

<dependentAssembly>
    <assemblyIdentity name="C"  
                      publicKeyToken="32ab4ba45e0a69a1"  
                      culture="en-us" />  

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

Możesz również określić zakres wersji do zmapowania:

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5" />  

Teraz biblioteka B, która została skompilowana w odniesieniu do C w wersji 1.1.1.0, będzie używać C w wersji 1.1.2.5 w czasie wykonywania. Oczywiście lepiej upewnij się, że biblioteka C jest kompatybilna wstecz, w przeciwnym razie może to prowadzić do nieoczekiwanych wyników.

Możesz przekierować dowolne wersje bibliotek, nie tylko te główne.


Do jakiego pliku i w jakiej sekcji się one mieszczą? Czy ktoś może podać link do źródła, takiego jak MSDN lub podobne w celach informacyjnych? Pamiętaj, że ludzie będą lądować na twoich artykułach SO Q / A z całej sfery wyszukiwarek, a odniesienia są krytyczne. Mój współpracownik powiedział mi, żebym „po prostu dodawał przekierowanie do zestawu do pliku exe” tuż przed wyjazdem na tydzień na wakacje i wylądowałem tutaj i chociaż ta odpowiedź wygląda świetnie, brakuje jej kontekstu i odniesienia.
partner

Prawidłowe pytania @tpartee, zredagowałem odpowiedź (w oczekiwaniu na recenzję), dodając
Kobus Smit

1
@AlexanderDerck w pliku konfiguracyjnym aplikacji A - nie mają one żadnego wpływu (o ile mi wiadomo) na pliki konfiguracyjne bibliotek, z wyjątkiem może sytuacji, gdy ta biblioteka jest biblioteką testów jednostkowych i jest w pewnym sensie „wykonywana” przez moduł uruchamiający testy jednostkowe.
Evk,

1
@AlexanderDerck kilka tygodni temu pojawiło się pytanie, z wieloma pozytywnymi opiniami, a nawet nagrodami, które zadawało dokładnie to, ale nikt nie był w stanie udzielić przekonującej odpowiedzi - stackoverflow.com/q/48377474/5311735
Evk

1
@CodeEngine publicKeyToken identyfikuje zestaw C. Tylko podpisane zestawy mają ten token klucza publicznego, który je identyfikuje. Oto powiązane pytanie o to, jak możesz znaleźć ten token, biorąc pod uwagę, że masz zestaw: stackoverflow.com/q/3045033/5311735
Evk

56

Napotkaliśmy problem z przekierowaniem wiązania dla NewtonSoft.Json. Sprawdziliśmy wersję pliku we właściwościach pliku „9.0.1.19813” systemu win 10, sprawdziliśmy numer i przekierowanie wciąż kończyło się niepowodzeniem. Dalsze badanie i okazało się, że szukaliśmy wersji pliku, a nie wersji zestawu. Zastanawiam się więc, czy ludzie mylą wersję pliku (która często się zmienia) i wersję zestawu (której nie widać w Eksploratorze plików systemu Windows 10). Aby zobaczyć wersję biblioteki DLL w zestawie, możesz uruchomić to w programie PowerShell. Zastąp nazwę biblioteki dll tą, dla której chcesz znaleźć wersję.

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

Wynikiem powyższego jest.

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

Zobacz referencje:

Jak mogę zobaczyć wersję zestawu zestawu .NET w systemie Windows Vista i nowszych (Windows 7, 2008)?

https://support.microsoft.com/en-nz/help/556041

wprowadź opis obrazu tutaj


12
Głosuj za podniesieniem różnicy między wersją pliku a wersją zestawu !!
mrid
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.