Przekierowywanie wersji zestawów
Notatka
Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .NET, w tym .NET 6 i nowszych wersji.
Odwołania do powiązań czasu kompilacji można przekierować do zestawów programu .NET Framework, zestawów innych firm lub zestawów własnej aplikacji. Możesz przekierować aplikację, aby używać innej wersji zestawu na wiele sposobów: za pośrednictwem zasad wydawcy, pliku konfiguracji aplikacji lub pliku konfiguracji komputera. W tym artykule opisano, jak działa wiązanie zestawów w .NET Framework i jak można je skonfigurować.
Napiwek
Ten artykuł jest specyficzny dla aplikacji .NET Framework. Aby uzyskać informacje o ładowaniu zestawów w .NET 5+ (i .NET Core), zobacz Ładowanie zależności w .NET.
Zjednoczenie zestawu i powiązanie domyślne
Powiązania z zestawami programu .NET Framework są czasami przekierowywane za pośrednictwem procesu o nazwie unifikacja zestawów. Program .NET Framework składa się z wersji środowiska uruchomieniowego języka wspólnego i około dwóch tuzinów zestawów .NET Framework tworzących bibliotekę typów. Te zestawy programu .NET Framework są traktowane przez środowisko uruchomieniowe jako pojedynczą jednostkę. Domyślnie po uruchomieniu aplikacji wszystkie odwołania do typów w kodzie uruchamianym przez środowisko uruchomieniowe są kierowane do zestawów programu .NET Framework, które mają ten sam numer wersji co środowisko uruchomieniowe załadowane w procesie. Przekierowania występujące w tym modelu są domyślnym zachowaniem środowiska uruchomieniowego.
Jeśli na przykład aplikacja odwołuje się do typów w przestrzeni nazw System.XML i została skompilowana przy użyciu programu .NET Framework 4.5, zawiera statyczne odwołania do zestawu System.XML dostarczanego ze środowiskiem uruchomieniowym w wersji 4.5. Jeśli chcesz przekierować odwołanie do powiązania, aby wskazać zestaw System.XML dostarczany w ramach programu .NET Framework 4, możesz umieścić informacje przekierowania w pliku konfiguracji aplikacji. Przekierowanie powiązania w pliku konfiguracji dla ujednoliconego zestawu .NET Framework anuluje zjednoczenie tego zestawu.
Ponadto można ręcznie przekierować wiązanie zestawu dla zestawów innych firm w przypadku, gdy istnieje wiele dostępnych wersji.
Napiwek
Jeśli zaktualizujesz pakiet NuGet, do którego odwołuje się twoja aplikacja pośrednio, i zaczniesz widzieć nowe błędy, takie jak FileLoadException
, MissingMethodException
, TypeLoadException
lub FileNotFoundException
, może być konieczne włączenie automatycznych przekierowań wiązań lub ręczne dodanie przekierowania wiązań. Jest to normalne w przypadku aktualizowania pakietów NuGet i wynika to z tworzenia niektórych pakietów względem starszej wersji zależności. Poniższy fragment pliku konfiguracji aplikacji dodaje przekierowanie powiązania dla pakietu System.Memory:
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
Przekierowywanie wersji za pomocą polityki wydawcy
Dostawcy zestawów mogą kierować aplikacje do nowszej wersji zestawu, dołączając plik zasad wydawcy do nowego zestawu. Plik zasad wydawcy, który znajduje się w globalnej pamięci podręcznej zestawów, zawiera ustawienia przekierowywania zestawów.
Każda wersja główna,.wersja pomocnicza zestawu ma własny plik zasad wydawcy. Na przykład przekierowania z wersji 2.0.2.222 do wersji 2.0.3.000 i z wersji 2.0.2.321 do wersji 2.0.3.000 przechodzą do tego samego pliku, ponieważ są one skojarzone z wersją 2.0. Jednak przekierowanie z wersji 3.0.0.999 do wersji 4.0.0.000 przechodzi do pliku w wersji 3.0.999. Każda główna wersja programu .NET Framework ma własny plik zasad wydawcy.
Jeśli plik zasad wydawcy istnieje dla zestawu, środowisko uruchomieniowe sprawdza ten plik po sprawdzeniu manifestu zestawu i pliku konfiguracji aplikacji. Dostawcy powinni używać plików zasad wydawcy tylko wtedy, gdy nowy zestaw jest wstecznie zgodny z odsyłanym zestawem.
Zasady wydawcy dla aplikacji można pominąć, określając ustawienia w pliku konfiguracji aplikacji, zgodnie z opisem w sekcji Pomiń zasady wydawcy.
Przekierowywanie wersji na poziomie aplikacji
Istnieje kilka różnych technik zmiany zachowania powiązania aplikacji za pomocą pliku konfiguracji aplikacji: można ręcznie edytować plik, można polegać na automatycznym przekierowywaniu powiązańlub określić zachowanie powiązania przez pomijając zasady wydawcy.
Ręczne edytowanie pliku konfiguracji aplikacji
Możesz ręcznie edytować plik konfiguracji aplikacji, aby rozwiązać problemy z zestawem. Jeśli na przykład dostawca zwalnia nowszą wersję zestawu używanego przez aplikację bez podawania zasad wydawcy (ponieważ nie gwarantują zgodności z poprzednimi wersjami), możesz skierować aplikację do korzystania z nowszej wersji zestawu, umieszczając informacje o powiązaniu zestawu w pliku konfiguracji aplikacji w następujący sposób.
<dependentAssembly>
<assemblyIdentity name="someAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
Polegaj na automatycznym przekierowywaniu wiązań
Podczas tworzenia aplikacji klasycznej w programie Visual Studio, która jest przeznaczona dla programu .NET Framework 4.5.1 lub nowszej wersji, aplikacja używa automatycznego przekierowywania powiązań. Oznacza to, że jeśli dwa składniki odwołują się do różnych wersji tego samego zestawu o silnych nazwach, środowisko uruchomieniowe automatycznie dodaje przekierowanie powiązania do nowszej wersji zestawu w pliku konfiguracji aplikacji wyjściowej (app.config). To przekierowanie unieważnia unifikację zestawu, która mogłaby inaczej mieć miejsce. Plik źródłowy app.config nie jest modyfikowany. Załóżmy na przykład, że aplikacja odwołuje się bezpośrednio do składnika .NET Framework poza pasmem, ale używa biblioteki innej firmy, która jest przeznaczona dla starszej wersji tego samego składnika. Podczas kompilowania aplikacji plik konfiguracji aplikacji wyjściowej jest modyfikowany tak, aby zawierał przekierowanie powiązania do nowszej wersji składnika.
Jeśli tworzysz aplikację internetową, otrzymasz ostrzeżenie kompilacji dotyczące konfliktu łączy, co z kolei daje możliwość dodania niezbędnego przekierowania łącza do źródłowego pliku konfiguracji aplikacji.
Jeśli ręcznie dodasz przekierowania powiązań do pliku źródłowego app.config, w czasie kompilacji program Visual Studio podejmie próbę ujednolicenia zestawów na podstawie przekierowań powiązań, które dodałeś. Załóżmy na przykład, że wstawisz następujące przekierowanie wiązań dla zestawu.
<bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0" />
Jeśli inny projekt w aplikacji odwołuje się do wersji 1.0.0.0 tego samego zestawu, automatyczne przekierowywanie powiązań dodaje następujący wpis do pliku wyjściowego app.config, aby aplikacja została ujednolicona w wersji 2.0.0.0 tego zestawu:
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
Możesz włączyć automatyczne przekierowywanie powiązań, jeśli aplikacja jest przeznaczona dla starszych wersji programu .NET Framework. Domyślne zachowanie można zastąpić, podając informacje o przekierowaniu wiązania w pliku app.config dla dowolnego komponentu zestawu, albo wyłączając funkcję przekierowania wiązania. Aby uzyskać informacje na temat włączania lub wyłączania tej funkcji, zobacz Jak włączyć i wyłączyć automatyczne przekierowywanie powiązań.
Obejście zasad wydawcy
W razie potrzeby można zastąpić zasady wydawcy w pliku konfiguracji aplikacji. Na przykład nowe wersje zestawów, które twierdzą, że są zgodne z poprzednimi wersjami, nadal mogą uszkodzić aplikację. Jeśli chcesz pominąć zasady wydawcy, dodaj element <publisherPolicy> do elementu dependentAssembly <> w pliku konfiguracji aplikacji i ustaw atrybut apply
na no
, co zastępuje wszystkie poprzednie ustawienia yes
.
<publisherPolicy apply="no" />
Pomiń zasady wydawcy, aby zachować działanie aplikacji dla użytkowników, ale upewnij się, że zgłosisz problem dostawcy zestawu. Jeśli zestaw zawiera plik zasad wydawcy, dostawca powinien upewnić się, że zestaw jest zgodny z poprzednimi wersjami i że klienci mogą korzystać z nowej wersji tak bardzo, jak to możliwe.
Przekierowywanie wersji testów, wtyczek lub bibliotek używanych przez inny składnik
W przypadku testów należy wygenerować plik .dll.config. Większość istniejących struktur testów jednostkowych honoruje te pliki podczas ładowania testów.
Wtyczki mogą obsługiwać pliki .dll.config, ale mogą ich także nie obsługiwać. Jedynym niezawodnym mechanizmem przekierowań jest zapewnienie bindingRedirects
przy tworzeniu AppDomain.
Możesz spróbować rozwiązać ten problem z obsługami zdarzeń AssemblyResolve, ale to nie działa, ponieważ te obsługi są wywoływane tylko przy nieudanym załadowaniu. Jeśli ładowanie zestawu powiedzie się, ponieważ zostało załadowane przez inny zestaw lub host, albo było obecne w GAC, nie zostanie wywołana procedura obsługi AssemblyResolve
.
Przekierowywanie wersji na poziomie komputera
Mogą wystąpić rzadkie przypadki, gdy administrator komputera chce, aby wszystkie aplikacje na komputerze używały określonej wersji zestawu. Na przykład określona wersja może naprawić dziurę zabezpieczeń. Jeśli zestaw jest przekierowywany w pliku konfiguracji maszyny o nazwie machine.config, wszystkie aplikacje na tym komputerze, które używają starej wersji, są kierowane do korzystania z nowej wersji. Plik konfiguracji maszyny zastępuje plik konfiguracji aplikacji i plik zasad wydawcy. Ten plik machine.config znajduje się w %windir%\Microsoft.NET\Framework[version]\config\machine.config dla maszyn 32-bitowych lub %windir%\Microsoft.NET\Framework64[version]\config\machine.config dla maszyn 64-bitowych.
Określanie powiązania zestawu w plikach konfiguracji
Ten sam format XML służy do określania przekierowań powiązań, niezależnie od tego, czy znajduje się w pliku konfiguracji aplikacji, pliku konfiguracji komputera, czy pliku zasad wydawcy. Aby przekierować jedną wersję zestawu do innej, użyj elementu <bindingRedirect>. Atrybut oldVersion
może określać jedną wersję zestawu lub zakres wersji. Atrybut newVersion
powinien określać jedną wersję. Na przykład <bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/>
określa, że środowisko uruchomieniowe powinno używać wersji 2.0.0.0 zamiast wersji zestawu z zakresu od 1.1.0.0 do 1.2.0.0.
Poniższy przykład kodu przedstawia różne scenariusze przekierowania powiązań. W przykładzie określono przekierowanie zakresu wersji dla myAssembly
oraz pojedyncze przekierowanie powiązań dla mySecondAssembly
. W przykładzie określono również, że plik polityki wydawcy nie zastąpi przekierowań wiązań dla myThirdAssembly
.
Aby powiązać zestaw, należy określić ciąg "urn:schemas-microsoft-com:asm.v1" z atrybutem xmlns
w tagu <assemblyBinding>.
<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 app,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="mySecondAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="myThirdAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Publisher policy can be set only in the app
configuration file. -->
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Ograniczanie powiązań zestawów do określonej wersji
Możesz użyć atrybutu appliesTo
w elemencie <assemblyBinding> w pliku konfiguracji aplikacji, aby przekierować odwołania powiązań zestawów do określonej wersji programu .NET Framework. Ten opcjonalny atrybut używa numeru wersji programu .NET Framework, aby wskazać, której wersji dotyczy. Jeśli nie określono atrybutu appliesTo
, element <assemblyBinding> ma zastosowanie do wszystkich wersji programu .NET Framework.
Aby na przykład przekierować powiązania zestawów w .NET Framework 3.5, należy zawrzeć następujący kod XML w pliku konfiguracyjnym aplikacji.
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
appliesTo="v3.5">
<dependentAssembly>
<!-- assembly information goes here -->
</dependentAssembly>
</assemblyBinding>
</runtime>
Należy wprowadzić informacje o przekierowaniu w kolejności wersji. Na przykład wprowadź informacje o przekierowaniu powiązań zestawu dla zestawów programu .NET Framework 3.5, a następnie dla zestawów programu .NET Framework 4.5. Na koniec wprowadź informacje dotyczące przekierowania powiązania zestawu dla każdego przekierowania zestawu w .NET Framework, które nie korzysta z atrybutu zestawu appliesTo
i w związku z tym dotyczy wszystkich wersji .NET Framework. Jeśli występuje konflikt podczas przekierowywania, zostanie użyta pierwsza zgodna instrukcja przekierowania w pliku konfiguracji.
Aby na przykład przekierować jedno odwołanie do zestawu .NET Framework 3.5 i inne odwołanie do zestawu .NET Framework 4, użyj wzorca pokazanego w poniższym pseudokodzie.
<assemblyBinding xmlns="..." appliesTo="v3.5 ">
<!--.NET Framework version 3.5 redirects here -->
</assemblyBinding>
<assemblyBinding xmlns="..." appliesTo="v4.0.30319">
<!--.NET Framework version 4.0 redirects here -->
</assemblyBinding>
<assemblyBinding xmlns="...">
<!-- redirects meant for all versions of the runtime -->
</assemblyBinding>
Zobacz też
- Jak włączyć i wyłączyć automatyczne przekierowywanie powiązań
- <bindingRedirect>, element
- Zezwolenie na zabezpieczenia przekierowania wiązania zestawów
- Zgromadzenia na platformie .NET
- Programowanie z użyciem bibliotek
- jak środowisko uruchomieniowe lokalizuje zestawy
- Konfigurowanie aplikacji
- Schemat ustawień środowiska uruchomieniowego
- schemat pliku konfiguracji
- Instrukcje: tworzenie zasad wydawcy