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

Odkazy na vazby při kompilaci můžete přesměrovat .NET Framework sestavení, sestavení třetích stran nebo sestavení vlastní aplikace. Aplikaci můžete přesměrovat na použití jiné verze 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 .NET Framework a jak je možné ji nakonfigurovat.

Tip

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

Sjednocení sestavení a výchozí vazba

Vazby k .NET Framework sestavení se někdy přesměrují prostřednictvím procesu nazývaného sjednocení sestavení. Modul .NET Framework se skládá z verze modulu CLR (Common Language Runtime) a přibližně .NET Framework sestavení, která tvoří knihovnu typů. S .NET Framework sestaveními se modul runtime zachází jako s jednou jednotkou. Ve výchozím nastavení jsou při spuštění aplikace všechny odkazy na typy v kódu spuštěném v modulu runtime směrovány na sestavení .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 například vaše aplikace odkazuje na typy v oboru názvů System.XML a byla sestavena pomocí .NET Framework 4.5, obsahuje statické odkazy na sestavení System.XML, které je součástí modulu runtime verze 4.5. Pokud chcete odkaz na vazbu přesměrovat tak, aby odkazovat na sestavení System.XML, které se dodá s .NET Framework 4, můžete do konfiguračního souboru aplikace umístit informace o přesměrování. Přesměrování vazby v konfiguračním souboru pro jednotné sestavení .NET Framework zruší sjednocení tohoto 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 směrovat aplikace na novější verzi sestavení zahrnutím souboru zásad vydavatele s novým sestavením. Soubor zásad vydavatele, který je umístěn v globální mezipaměti sestavení (GAC), obsahuje nastavení přesměrování sestavení.

Každý hlavní . podvergní verze sestavení má svůj 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 přechází do stejného souboru, protože jsou přidruženy k verzi 2.0. Přesměrování z verze 3.0.0.999 na verzi 4.0.0.000 ale přejde do souboru verze 3.0.999. Každá hlavní verze aplikace .NET Framework vlastní soubor zásad vydavatele.

Pokud soubor zásad vydavatele existuje pro sestavení, 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ěrovanou sestavení.

Zásady vydavatele pro vaši aplikaci můžete obejít zadáním nastavení v konfiguračním souboru aplikace, jak je popsáno v části Obcházení 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: můžete ručně upravit soubor ,můžete se spolehnout na automatické přesměrování vazby nebomůžete určit chování vazby obejití zásad vydavatele.

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

Pokud chcete vyřešit problémy se sestavením, můžete ručně upravit konfigurační soubor aplikace. Pokud třeba dodavatel může vydat novější verzi sestavení, kterou vaše aplikace používá bez poskytnutí zásad vydavatele, protože nezaručují zpětnou kompatibilitu, můžete aplikaci nasměrovat, aby novější verzi sestavení pokládal následujícím způsobem do konfiguračního souboru vaší aplikace informace vazby sestavení.

<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 Visual Studio která cílí na .NET Framework 4.5.1 nebo novější verzi, použije aplikace 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 na novější verzi sestavení ve výstupním souboru konfigurace aplikace (app.config). Toto přesměrování přepíše sjednocení sestavení, které by jinak mohlo proejít. Zdrojový soubor app.config není změněn. Řekněme například, že vaše aplikace přímo odkazuje na komponentu .NET Framework mimo pásmo, 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 upravuje tak, aby obsahoval přesměrování vazby na novější verzi komponenty. Pokud vytvoříte webovou aplikaci, zobrazí se upozornění sestavení týkající se konfliktu vazeb, které vám pak dává možnost 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, nástroj Visual Studio se pokusí sjednotit sestavení na základě přesměrování vazby, která jste přidali. Řekněme například, že pro sestavení vložíte následující přesměrování vazby:

<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í, přidá automatické přesměrování vazby do výstupního souboru app.config následující položku, aby aplikace byla jednotná 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 .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é jsou zpětně kompatibilní, naopak mohou aplikaci přerušit. Pokud chcete obejít zásady vydavatele, přidejte element do elementu v konfiguračním souboru aplikace a nastavte atribut Apply na ne, který přepíše předchozí <publisherPolicy> <dependentAssembly> nastavení Ano.

<publisherPolicy apply="no" />

Obejití zásad vydavatele, aby vaše aplikace běžela pro vaše uživatele, ale nezapomeňte problém nahlásit dodavateli sestavení. Pokud sestavení obsahuje soubor zásad vydavatele, měl by dodavatel zajistit, aby sestavení bylo zpětně kompatibilní a aby klienti mohli používat novou verzi co nejvíce.

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

Mohou se zobrazit vzácné případy, kdy správce počítače chce, aby všechny aplikace v počítači používají určitou verzi sestavení. Konkrétní verze může například opravit bezpečnostní otvor. Pokud je sestavení přesměrováno v konfiguračním souboru počítače nazývaném machine.config, budou všechny aplikace na tomto počítači, které používají starou verzi, směrovány na používání nové verze. Konfigurační soubor počítače přepíše konfigurační soubor aplikace a soubor zásad vydavatele. Tento machine.config se nachází ve složce %windir%\Microsoft.NET\Framework [ version]\config\machine.config for 32-bit machines, or %windir%\Microsoft.NET\Framework64 [ version]\config\machine.config for 64-bit machines.

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

Stejný formát XML použijete k určení přesměrování vazeb bez ohledu na to, jestli se nachází v konfiguračním souboru aplikace, konfiguračním souboru počítače nebo souboru zásad vydavatele. Chcete-li přesměrovat jednu verzi sestavení na jinou, použijte <bindingRedirect> element . Atribut oldVersion může zadat jednu verzi sestavení nebo rozsah verzí. Atribut newVersion by měl zadat jednu verzi. Například určuje, že modul runtime by měl používat verzi <bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/> 2.0.0.0 místo verzí sestavení mezi 1.1.0.0 a 1.2.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 myAssembly a jedno přesměrování vazby pro mySecondAssembly . Příklad také určuje, že soubor zásad vydavatele nepřepíše přesměrování vazeb pro myThirdAssembly .

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

<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

Pomocí atributu appliesTo u elementu v konfiguračním souboru aplikace můžete přesměrovat odkazy vazby sestavení na konkrétní <assemblyBinding> verzi .NET Framework. Tento volitelný atribut používá .NET Framework verze k označení verze, na které se vztahuje. Pokud není zadán atribut appliesTo, <assemblyBinding> element se použije pro všechny verze .NET Framework.

Pokud chcete například přesměrovat vazbu sestavení pro sestavení .NET Framework 3.5, zahrnete do konfiguračního souboru aplikace 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>

Informace o přesměrování byste měli zadat v pořadí podle verze. Zadejte například informace o přesměrování vazby sestavení pro sestavení .NET Framework 3.5 následovaná sestaveními .NET Framework 4.5. Nakonec zadejte informace o přesměrování vazby sestavení pro přesměrování .NET Framework sestavení, které nevyu používá atribut appliesTo, a proto platí pro všechny verze .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.

Chcete-li například přesměrovat jeden odkaz na sestavení .NET Framework 3.5 a další 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é