Przekierowywanie wersji zestawuRedirecting Assembly Versions

Możesz przekierować odwołania związane z czasem kompilacji do zestawów .NET Framework, zestawów innych firm lub zestawów Twojej własnej aplikacji.You can redirect compile-time binding references to .NET Framework assemblies, third-party assemblies, or your own app's assemblies. Można przekierować aplikację do używania różnych wersji zestawu na różne sposoby: za pomocą zasad wydawcy, za pomocą pliku konfiguracji aplikacji; lub za pomocą pliku konfiguracji komputera.You can redirect your app to use a different version of an assembly in a number of ways: through publisher policy, through an app configuration file; or through the machine configuration file. W tym artykule omówiono, jak działa powiązanie zestawu w programie .NET Framework i jak można skonfigurować.This article discusses how assembly binding works in the .NET Framework and how it can be configured.

Unifikacja zestawów i powiązania domyślneAssembly unification and default binding

Powiązania do zestawów .NET Framework czasami są przekierowywane w procesie zwanym unifikacja zestawu.Bindings to .NET Framework assemblies are sometimes redirected through a process called assembly unification. .NET Framework składa się z wersją środowiska uruchomieniowego języka wspólnego i około dwóch tuzinów zestawów .NET Framework, które tworzą bibliotekę typów.The .NET Framework consists of a version of the common language runtime and about two dozen .NET Framework assemblies that make up the type library. Te zestawy .NET Framework są traktowane w czasie wykonywania jako pojedyncza jednostka.These .NET Framework assemblies are treated by the runtime as a single unit. Domyślnie gdy aplikacja jest uruchamiana, wszystkie odwołania do typów w kodzie wykonywanym przez środowisko uruchomieniowe są kierowane do zestawów .NET Framework, które mają ten sam numer wersji środowiska uruchomieniowego, który jest załadowany w procesie.By default, when an app is launched, all references to types in code run by the runtime are directed to .NET Framework assemblies that have the same version number as the runtime that is loaded in a process. Przekierowań, które występują w tym modelu są domyślnym zachowaniem dla środowiska uruchomieniowego.The redirections that occur with this model are the default behavior for the runtime.

Na przykład, jeśli aplikacja odwołuje się do typów w przestrzeni nazw System.XML i została skompilowana przy użyciu .NET Framework 4.5.NET Framework 4.5, zawiera odwołania statyczne do zestawu System.XML, który jest dostarczany za pomocą środowiska uruchomieniowego w wersji 4.5.For example, if your app references types in the System.XML namespace and was built by using the .NET Framework 4.5.NET Framework 4.5, it contains static references to the System.XML assembly that ships with runtime version 4.5. Chcąc przekierować odwołanie powiązania tak, aby wskazywać zestaw System.XML dostarczany z .NET Framework 4, możesz umieścić informacje o przekierowaniu w pliku konfiguracji aplikacji.If you want to redirect the binding reference to point to the System.XML assembly that ship with the .NET Framework 4, you can put redirect information in the app configuration file. Przekierowanie powiązania w pliku konfiguracji dla ujednoliconego zestawu .NET Framework anuluje ujednolicenie dla tego zestawu.A binding redirection in a configuration file for a unified .NET Framework assembly cancels the unification for that assembly.

Ponadto możesz chcieć ręcznie przekierować powiązanie zestawu dla zestawów innych firm, jeśli istnieje wiele wersji.In addition, you may want to manually redirect assembly binding for third-party assemblies if there are multiple versions available.

Przekierowanie wersji zestawu przy użyciu zasad wydawcyRedirecting assembly versions by using publisher policy

Dostawcy zestawów mogą przekierować aplikacje do nowszej wersji zestawu, dołączając plik zasad wydawcy z nowego zestawu.Vendors of assemblies can direct apps to a newer version of an assembly by including a publisher policy file with the new assembly. Plik zasad wydawcy, który znajduje się w globalnej pamięci podręcznej, zawiera ustawienia przekierowywania zestawu.The publisher policy file, which is located in the global assembly cache, contains assembly redirection settings.

Każdy głównych. drobne wersja zestawu ma swój własny plik zasad wydawcy.Each major.minor version of an assembly has its own publisher policy file. Na przykład przekierowania z wersji 2.0.2.222 do 2.0.3.000 i z wersji 2.0.2.321 do wersji 2.0.3.000 idą do tego samego pliku, ponieważ są one związane z wersją 2.0.For example, redirections from version 2.0.2.222 to 2.0.3.000 and from version 2.0.2.321 to version 2.0.3.000 both go into the same file, because they are associated with version 2.0. Jednakże przekierowanie z wersji 3.0.0.999 do wersji 4.0.0.000 wchodzi przechodzi do pliku dla wersji 3.0.999.However, a redirection from version 3.0.0.999 to version 4.0.0.000 goes into the file for version 3.0.999. Każda główna wersja środowiska .NET Framework ma swój własny plik zasad wydawcy.Each major version of the .NET Framework has its own publisher policy file.

Jeśli plik zasad wydawcy istnieje dla zestawu, środowisko uruchomieniowe sprawdza ten plik po sprawdzeniu pliku konfiguracji aplikacji i manifest zestawu.If a publisher policy file exists for an assembly, the runtime checks this file after checking the assembly's manifest and app configuration file. Dostawcy powinni używać plików zasad wydawcy tylko wtedy, gdy nowy zestaw jest zgodny z poprzednimi wersjami z przekierowywanego zestawu.Vendors should use publisher policy files only when the new assembly is backward compatible with the assembly being redirected.

Można pominąć zasad wydawcy dla twojej aplikacji poprzez określenie ustawień w pliku konfiguracji aplikacji, zgodnie z opisem w pomijanie sekcji zasad wydawcy.You can bypass publisher policy for your app by specifying settings in the app configuration file, as discussed in the Bypassing publisher policy section.

Przekierowanie wersji zestawu na poziomie aplikacjiRedirecting assembly versions at the app level

Istnieje kilka różnych technik zmieniania zachowania powiązania dla swojej aplikacji za pomocą pliku konfiguracji aplikacji: możesz ręcznie edytować plik, możesz polegać na automatyczne przekierowywanie powiązań lub możesz określić zachowanie powiązania, pomijając zasady wydawcy.There are a few different techniques for changing the binding behavior for your app through the app configuration file: you can manually edit the file, you can rely on automatic binding redirection, or you can specify binding behavior by bypassing publisher policy.

Ręczna Edycja pliku konfiguracyjnego aplikacjiManually editing the app config file

Można ręcznie edytować pliku konfiguracji aplikacji w celu rozwiązania problemów ze złożeniem.You can manually edit the app configuration file to resolve assembly issues. Na przykład jeśli dostawca wydaje nowszą wersję zestawu, który aplikacja używa bez podania zasad wydawcy, ponieważ nie gwarantują one zgodności z poprzednimi wersjami, należy skierować aplikację do korzystania z nowszej wersji zestawu poprzez umieszczenie zestawu powiązania następujące informacje w pliku konfiguracyjnym aplikacji.For example, if a vendor might release a newer version of an assembly that your app uses without supplying a publisher policy, because they do not guarantee backward compatibility, you can direct your app to use the newer version of the assembly by putting assembly binding information in your app's configuration file as follows.

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

Opierając się na automatyczne przekierowywanie powiązańRelying on automatic binding redirection

Po utworzeniu aplikacji klasycznej w programie Visual Studio przeznaczonych .NET Framework 4.5.1.NET Framework 4.5.1 lub jego nowsza wersja aplikacji używa automatycznego przekierowywania powiązań.When you create a desktop app in Visual Studio that targets the .NET Framework 4.5.1.NET Framework 4.5.1 or a later version, the app uses automatic binding redirection. Oznacza to, że jeśli dwa składniki odwołują się do różnych wersji tego samego zestawu z silną nazwą, — środowisko uruchomieniowe automatycznie dodaje przekierowanie powiązań do nowszej wersji zestawu w pliku konfiguracyjnym (app.config) danych wyjściowych aplikacji.This means that if two components reference different versions of the same strong-named assembly, the runtime automatically adds a binding redirection to the newer version of the assembly in the output app configuration (app.config) file. Przekierowanie zastępuje unifikację zestawów, w przeciwnym razie może mieć miejsce.This redirection overrides the assembly unification that might otherwise take place. Źródłowy plik app.config nie jest modyfikowany.The source app.config file is not modified. Załóżmy na przykład, że Twoja aplikacja bezpośrednio odwołuje się do składnik .NET Framework out-of-band ale używa biblioteki innej firmy, który jest przeznaczony dla starszej wersji tego samego składnika.For example, let's say that your app directly references an out-of-band .NET Framework component but uses a third-party library that targets an older version of the same component. Podczas kompilowania aplikacji wyjściowy plik konfiguracji aplikacji jest modyfikowany do przez dołączenie przekierowania powiązania do nowszej wersji składnika.When you compile the app, the output app configuration file is modified to contain a binding redirection to the newer version of the component. Jeśli tworzysz aplikację sieci web, pojawi się ostrzeżenie kompilacji dotyczące konfliktu powiązania, co z kolei daje możliwość dodania niezbędnego przekierowania powiązania do źródłowego pliku konfiguracji sieci web.If you create a web app, you receive a build warning regarding the binding conflict, which in turn, gives you the option to add the necessary binding redirect to the source web configuration file.

Jeśli ręcznie dodasz przekierowania powiązań do pliku app.config źródła, w czasie kompilacji, Visual Studio próbuje ujednolicić zestawy w oparciu o przekierowania powiązań dodane.If you manually add binding redirects to the source app.config file, at compile time, Visual Studio tries to unify the assemblies based on the binding redirects you added. Załóżmy na przykład, że wstawiasz następujące przekierowanie powiązania dla zestawu:For example, let's say you insert the following binding redirect for an assembly:

<bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0" />

Jeśli w wersji 1.0.0.0 tego samego zestawu odwołuje się do innego projektu w aplikacji, automatyczne przekierowywanie powiązań dodaje następujący wpis do pliku wyjściowego app.config, tak, aby aplikacja jest jednolita w wersji 2.0.0.0 tego zestawu:If another project in your app references version 1.0.0.0 of the same assembly, automatic binding redirection adds the following entry to the output app.config file so that the app is unified on version 2.0.0.0 of this assembly:

<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />

Można włączyć automatyczne przekierowywanie powiązań, jeśli aplikacja jest przeznaczona na starsze wersje programu .NET Framework.You can enable automatic binding redirection if your app targets older versions of the .NET Framework. To zachowanie domyślne można przesłonić, podając informacje o przekierowaniach powiązań w pliku app.config do dowolnego złożenia lub przez wyłączenie funkcji przekierowania powiązania.You can override this default behavior by providing binding redirection information in the app.config file for any assembly, or by turning off the binding redirection feature. Aby dowiedzieć się, jak włączyć tę funkcję, lub wyłączyć, zobacz jak: Włączanie i wyłączanie automatycznego przekierowywania powiązań.For information about how to turn this feature on or off, see How to: Enable and Disable Automatic Binding Redirection.

Pomijanie zasad wydawcyBypassing publisher policy

Można nadpisać zasady publikowania w pliku konfiguracji aplikacji, jeśli to konieczne.You can override publisher policy in the app configuration file if necessary. Na przykład nowe wersje zestawów, które uważają się zgodne z poprzednimi wersjami mogą nadal zerwać działanie aplikacji.For example, new versions of assemblies that claim to be backward compatible can still break an app. Jeśli chcesz pominąć zasad wydawcy, Dodaj <publisherPolicy > elementu <dependentAssembly > elementu w pliku konfiguracji aplikacji, a zestaw zastosować atrybutu nie, co zastępuje wszystkie poprzednie tak ustawienia.If you want to bypass publisher policy, add a <publisherPolicy> element to the <dependentAssembly> element in the app configuration file, and set the apply attribute to no, which overrides any previous yes settings.

<publisherPolicy apply="no" />

Omiń zasady wydawcy, aby zachować swoją aplikację dla użytkowników, ale upewnij się, że możesz zgłosić problem dostawcy zestawu.Bypass publisher policy to keep your app running for your users, but make sure you report the problem to the assembly vendor. Jeśli zestaw ma plik zasad wydawcy, dostawca powinien upewnić się, że zestaw jest zgodny z poprzednimi wersjami i że klienci mogą używać nowej wersji, jak to możliwe.If an assembly has a publisher policy file, the vendor should make sure that the assembly is backward compatible and that clients can use the new version as much as possible.

Przekierowanie wersji zestawu na poziomie komputeraRedirecting assembly versions at the machine level

Może istnieć rzadkich przypadkach, gdy administrator komputera chce, aby wszystkie aplikacje na komputerze, aby użyć określonej wersji zestawu.There might be rare cases when a machine administrator wants all apps on a computer to use a specific version of an assembly. Na przykład administrator może być każda aplikacja korzystała z określonej wersji zestawu, ponieważ ta wersja naprawia lukę w zabezpieczeniach.For example, the administrator might want every app to use a particular assembly version, because that version fixes a security hole. Jeśli zestaw jest przekierowany w pliku konfiguracyjnym komputera, wszystkie aplikacje na tym komputerze, które używają starej wersji nastąpi przekierowanie do nowej wersji.If an assembly is redirected in the machine's configuration file, all apps on that machine that use the old version will be directed to use the new version. Plik konfiguracji komputera zastępuje plik konfiguracji aplikacji i plik zasad wydawcy.The machine configuration file overrides the app configuration file and the publisher policy file. Ten plik znajduje się w folderze %ścieżka instalacji środowiska uruchomieniowego%\Config katalogu.This file is located in the %runtime install path%\Config directory. Zazwyczaj program .NET Framework jest instalowany w katalogu %drive%\Windows\Microsoft.NET\Framework.Typically, the .NET Framework is installed in the %drive%\Windows\Microsoft.NET\Framework directory.

Określanie powiązania zestawu w plikach konfiguracjiSpecifying assembly binding in configuration files

Możesz użyć tego samego formatu XML do określenia przekierowań powiązania, czy znajduje się w pliku konfiguracji aplikacji, plik konfiguracji komputera lub plik zasad wydawcy.You use the same XML format to specify binding redirects whether it’s in the app configuration file, the machine configuration file, or the publisher policy file. Przekierowywanie wersji zestawu do innego, należy użyć <bindingRedirect > elementu.To redirect one assembly version to another, use the <bindingRedirect> element. OldVersion atrybutu można określić jedną wersję zestawu lub zakres wersji.The oldVersion attribute can specify a single assembly version or a range of versions. newVersion Atrybut powinien określać jedną wersję.The newVersion attribute should specify a single version. 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 między 1.1.0.0 a 1.2.0.0.For example, <bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/> specifies that the runtime should use version 2.0.0.0 instead of the assembly versions between 1.1.0.0 and 1.2.0.0.

Poniższy przykład kodu demonstruje różne scenariusze przekierowywania powiązań.The following code example demonstrates a variety of binding redirect scenarios. Przykład określa przekierowanie zakresu wersji zestawu myAssemblyi Przekierowanie pojedynczego powiązania dla mySecondAssembly.The example specifies a redirect for a range of versions for myAssembly, and a single binding redirect for mySecondAssembly. W przykładzie określono również, że plik zasad wydawcy nie spowoduje zastąpienia przekierowań powiązań dla zestawu myThirdAssembly.The example also specifies that publisher policy file will not override the binding redirects for myThirdAssembly.

Do powiązania zestawu, należy określić ciąg "urn: schemas-microsoft-com:asm.v1" za pomocą xmlns atrybutu w <assemblyBinding > tagu.To bind an assembly, you must specify the string "urn:schemas-microsoft-com:asm.v1" with the xmlns attribute in the <assemblyBinding> tag.

<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ązania zestawu do określonej wersjiLimiting assembly bindings to a specific version

Możesz użyć appliesTo atrybutu na <assemblyBinding > elementu w pliku konfiguracji aplikacji do przekierowywania odwołań do powiązań zestawów do określonej wersji programu .NET Struktura.You can use the appliesTo attribute on the <assemblyBinding> element in an app configuration file to redirect assembly binding references to a specific version of the .NET Framework. Ten atrybut opcjonalny używa numeru wersji .NET Framework, aby wskazać dla której wersji dotyczy.This optional attribute uses a .NET Framework version number to indicate what version it applies to. Jeśli nie appliesTo atrybut jest określony, <assemblyBinding > element ma zastosowanie do wszystkich wersji programu .NET Framework.If no appliesTo attribute is specified, the <assemblyBinding> element applies to all versions of the .NET Framework.

Na przykład aby przekierować powiązanie zestawu dla zestawu .NET Framework 3.5, należy dołączyć następujący kod XML w pliku konfiguracyjnym aplikacji.For example, to redirect assembly binding for a .NET Framework 3.5 assembly, you would include the following XML code in your app configuration file.

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
    appliesTo="v3.5">
    <dependentAssembly>
      <!-- assembly information goes here -->
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Informacje o przekierowaniach należy wprowadzić w kolejności wersji.You should enter redirection information in version order. Na przykład wprowadź informacje o przekierowaniach powiązań zestawów dla zestawów .NET Framework 3.5, następuje zestawów .NET Framework 4.5.For example, enter assembly binding redirection information for .NET Framework 3.5 assemblies followed by .NET Framework 4.5 assemblies. Na koniec wprowadź informacje o przekierowaniach powiązań zestawów dla przekierowania z zestawu .NET Framework, która nie korzysta z appliesTo atrybut i dlatego ma zastosowanie do wszystkich wersji programu .NET Framework.Finally, enter assembly binding redirection information for any .NET Framework assembly redirection that does not use the appliesTo attribute and therefore applies to all versions of the .NET Framework. Jeśli istnieje konflikt w przekierowania, jest używana pierwsza pasująca instrukcja przekierowania w pliku konfiguracji.If there is a conflict in redirection, the first matching redirection statement in the configuration file is used.

Na przykład aby przekierować jedno odwołanie do zestawu .NET Framework 3.5 a inne odwołanie do zestawu .NET Framework 4, użyj wzoru pokazanego w poniższym pseudokodzie.For example, to redirect one reference to a .NET Framework 3.5 assembly and another reference to a .NET Framework 4 assembly, use the pattern shown in the following pseudocode.

<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żSee Also