Přesměrování verzí sestavení

Odkazy na vazby v době kompilace můžete přesměrovat na sestavení rozhraní .NET Framework, sestavení třetích stran nebo sestavení vlastní aplikace. Aplikaci můžete přesměrovat tak, aby používala jinou verzi sestavení několika způsoby: prostřednictvím zásad vydavatele prostřednictvím konfiguračního souboru aplikace; nebo prostřednictvím konfiguračního souboru počítače. Tento článek popisuje, jak funguje vazba sestavení v rozhraní .NET Framework a jak je možné ji nakonfigurovat.

Tip

Tento článek je specifický pro aplikace rozhraní .NET Framework. Informace o načítání sestavení v .NET 5+ (a .NET Core) naleznete v tématu Načítání závislostí v .NET.

Sjednocení sestavení a výchozí vazba

Vazby na sestavení rozhraní .NET Framework se někdy přesměrují prostřednictvím procesu označovaného jako sjednocení sestavení. .NET Framework se skládá z verze modulu CLR (Common Language Runtime) a asi dvou desítek sestavení rozhraní .NET Framework, která tvoří knihovnu typů. Tato sestavení rozhraní .NET Framework se zachází modulem runtime jako s jednou jednotkou. Při spuštění aplikace se ve výchozím nastavení všechny odkazy na typy v kódu spouštěné modulem runtime směrují na sestavení rozhraní .NET Framework, která mají stejné číslo verze jako modul runtime načtený v procesu. Přesměrování, ke kterým dochází u tohoto modelu, jsou výchozím chováním modulu runtime.

Pokud vaše aplikace například odkazuje na typy v oboru názvů System.XML a byla vytvořena pomocí rozhraní .NET Framework 4.5, obsahuje statické odkazy na sestavení System.XML, které je dodáváno s modulem runtime verze 4.5. Pokud chcete odkaz na vazbu přesměrovat na sestavení System.XML, které je dodáváno s rozhraním .NET Framework 4, můžete informace o přesměrování umístit do konfiguračního souboru aplikace. Přesměrování vazby v konfiguračním souboru pro sjednocené sestavení .NET Framework zruší sjednocení pro toto sestavení.

Kromě toho můžete chtít ručně přesměrovat vazbu sestavení pro sestavení třetích stran, pokud je k dispozici více verzí.

Přesměrování verzí pomocí zásad vydavatele

Dodavatelé sestavení mohou aplikace směrovat na novější verzi sestavení zahrnutím souboru zásad vydavatele s novým sestavením. Soubor zásad vydavatele, který se nachází v globální mezipaměti sestavení, obsahuje nastavení přesměrování sestavení.

Každý hlavní.Podverze sestavení má vlastní soubor zásad vydavatele. Například přesměrování z verze 2.0.2.222 na 2.0.3.000 a z verze 2.0.2.321 na verzi 2.0.3.000 oba přejdou do stejného souboru, protože jsou přidružené k verzi 2.0. Přesměrování z verze 3.0.0.999 na verzi 4.0.0.000 však přejde do souboru verze 3.0.999. Každá hlavní verze rozhraní .NET Framework má vlastní soubor zásad vydavatele.

Pokud pro sestavení existuje soubor zásad vydavatele, modul runtime zkontroluje tento soubor po kontrole manifestu sestavení a konfiguračního souboru aplikace. Dodavatelé by měli používat soubory zásad vydavatele pouze v případě, že je nové sestavení zpětně kompatibilní s přesměrovaným sestavením.

Zásady vydavatele aplikace můžete obejít zadáním nastavení v konfiguračním souboru aplikace, jak je popsáno v části Obejití zásad vydavatele.

Přesměrování verzí na úrovni aplikace

Existuje několik různých technik pro změnu chování vazby pro vaši aplikaci prostřednictvím konfiguračního souboru aplikace: soubor můžete ručně upravit, můžete se spolehnout na automatické přesměrování vazby nebo můžete určit chování vazby tak, že vynecháte zásady vydavatele.

Ruční úprava konfiguračního souboru aplikace

Konfigurační soubor aplikace můžete upravit ručně a vyřešit tak problémy se sestavením. Pokud například dodavatel může vydat novější verzi sestavení, které vaše aplikace používá bez poskytnutí zásad vydavatele, protože nezaručují zpětnou kompatibilitu, můžete aplikaci směrovat tak, aby používala novější verzi sestavení tak, že do konfiguračního souboru vaší aplikace vloží informace o vazbě sestavení následujícím způsobem.

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

Spoléhání na automatické přesměrování vazby

Když vytvoříte desktopovou aplikaci v sadě Visual Studio, která cílí na rozhraní .NET Framework 4.5.1 nebo novější verzi, aplikace použije automatické přesměrování vazby. To znamená, že pokud dvě komponenty odkazují na různé verze stejného sestavení se silným názvem, modul runtime automaticky přidá přesměrování vazby do novější verze sestavení v souboru konfigurace výstupní aplikace (app.config). Toto přesměrování přepíše sjednocení sestavení, které by jinak mohlo proběhnout. Zdrojový soubor app.config není změněn. Řekněme například, že vaše aplikace přímo odkazuje na vzdálenou komponentu rozhraní .NET Framework, ale používá knihovnu třetí strany, která cílí na starší verzi stejné komponenty. Při kompilaci aplikace se konfigurační soubor výstupní aplikace upraví tak, aby obsahoval přesměrování vazby na novější verzi komponenty. Pokud vytvoříte webovou aplikaci, zobrazí se upozornění na sestavení týkající se konfliktu vazby, které vám zase umožní přidat potřebné přesměrování vazby do zdrojového konfiguračního souboru webu.

Pokud ručně přidáte přesměrování vazby do zdrojového souboru app.config, visual Studio se pokusí sjednotit sestavení na základě vazeb, které jste přidali. Řekněme například, že vložíte následující přesměrování vazby pro sestavení:

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

Pokud jiný projekt ve vaší aplikaci odkazuje na verzi 1.0.0.0 stejného sestavení, automatické přesměrování vazby přidá následující položku do výstupního souboru app.config tak, aby aplikace byla sjednocená ve verzi 2.0.0.0 tohoto sestavení:

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

Automatické přesměrování vazby můžete povolit, pokud vaše aplikace cílí na starší verze rozhraní .NET Framework. Toto výchozí chování můžete přepsat poskytnutím informací o přesměrování vazby v souboru app.config pro jakékoli sestavení nebo vypnutím funkce přesměrování vazby. Informace o tom, jak tuto funkci zapnout nebo vypnout, najdete v tématu Postupy: Povolení a zakázání automatického přesměrování vazby.

Obejití zásad vydavatele

V případě potřeby můžete přepsat zásady vydavatele v konfiguračním souboru aplikace. Například nové verze sestavení, která deklarují zpětnou kompatibilitu, mohou stále narušit aplikaci. Pokud chcete obejít zásady vydavatele, přidejte element publisherPolicy> do závislého< elementuAssembly> v konfiguračním souboru aplikace a nastavte atribut apply na ne, který přepíše předchozí nastavení ano.<

<publisherPolicy apply="no" />

Obejít zásady vydavatele, aby vaše aplikace běžela pro uživatele, ale ujistěte se, že nahlásíte problém dodavateli sestavení. Pokud má sestavení soubor zásad vydavatele, dodavatel by se měl ujistit, že sestavení je zpětně kompatibilní a že klienti mohou používat novou verzi co nejvíce.

Přesměrování verzí na úrovni počítače

Může se stát, že správce počítače chce, aby všechny aplikace v počítači používaly konkrétní verzi sestavení. Například konkrétní verze může opravit bezpečnostní díru. Pokud je sestavení přesměrováno v konfiguračním souboru počítače s názvem machine.config, všechny aplikace na daném počítači, které používají starou verzi, se přesměrují tak, aby používaly novou verzi. Konfigurační soubor počítače přepíše konfigurační soubor aplikace a soubor zásad vydavatele. Tento soubor machine.config se nachází v umístění %windir%\Microsoft.NET\Framework[version]\config\machine.config pro 32bitové počítače nebo %windir%\Microsoft.NET\Framework64[version]\config\machine.config pro 64bitové počítače.

Určení vazby sestavení v konfiguračních souborech

Stejný formát XML slouží k určení přesměrování vazby, ať už se jedná o konfigurační soubor aplikace, konfigurační soubor počítače nebo soubor zásad vydavatele. Pokud chcete přesměrovat jednu verzi sestavení na jinou <, použijte element bindingRedirect> . Atribut oldVersion může zadat jednu verzi sestavení nebo rozsah verzí. Atribut newVersion by měl obsahovat jednu verzi. Například určuje, <bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/> že modul runtime by měl místo verzí sestavení 1.1.0.0 a 1.2.0.0 používat verzi 2.0.0.0.

Následující příklad kódu ukazuje různé scénáře přesměrování vazby. Příklad určuje přesměrování pro rozsah verzí pro myAssemblya jedno vazbové přesměrování pro mySecondAssembly. Příklad také určuje, že soubor zásad vydavatele nepřepíše přesměrování vazby pro myThirdAssembly.

Chcete-li vytvořit vazbu sestavení, je nutné zadat řetězec "urn:schemas-microsoft-com:asm.v1" s atributem xmlns ve <značce 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>

Omezení vazeb sestavení na konkrétní verzi

Atribut appliesTo můžete použít u elementu <assemblyBinding> v konfiguračním souboru aplikace k přesměrování odkazů na vazby sestavení na konkrétní verzi rozhraní .NET Framework. Tento volitelný atribut používá číslo verze rozhraní .NET Framework k označení, na jakou verzi se vztahuje. Pokud není zadán atribut appliesTo, <element assemblyBinding> se vztahuje na všechny verze rozhraní .NET Framework.

Například pro přesměrování vazby sestavení pro sestavení .NET Framework 3.5 byste do konfiguračního souboru aplikace zahrnuli následující kód XML.

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

Měli byste zadat informace o přesměrování v pořadí verzí. Zadejte například informace o přesměrování vazby sestavení pro sestavení rozhraní .NET Framework 3.5 následované sestaveními rozhraní .NET Framework 4.5. Nakonec zadejte informace o přesměrování vazby sestavení pro jakékoli přesměrování sestavení rozhraní .NET Framework, které nepoužívá atribut appliesTo , a proto platí pro všechny verze rozhraní .NET Framework. Pokud dojde ke konfliktu přesměrování, použije se první odpovídající příkaz přesměrování v konfiguračním souboru.

Pokud chcete například přesměrovat jeden odkaz na sestavení .NET Framework 3.5 a jiný odkaz na sestavení .NET Framework 4, použijte vzor zobrazený v následujícím pseudokódu.

<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>

Viz také