Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka
Tento článek je specifický pro .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.
Odkazy na vazby v době kompilace můžete přesměrovat na sestavení .NET Framework, sestavení třetích stran nebo sestavení vaší 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, konfiguračního souboru aplikace nebo konfiguračního souboru počítače. Tento článek popisuje, jak funguje vazba sestavení v .NET Frameworku a jak ji můžete nakonfigurovat.
Spropitné
Tento článek je specifický pro aplikace .NET Framework. Informace o načítání sestavení v .NET 5+ (a .NET Core) najdete v náčítání závislostí v .NET.
Sjednocení sestavení a výchozí vazba
Vazby na sestavení .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 přibližně dvou desítek sestavení .NET Framework, která tvoří knihovnu typů. Tato sestavení .NET Framework jsou modulem runtime považována za jednu jednotku. 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í .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í .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 .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 sjednocenou sestavu .NET Framework zruší sjednocení pro tuto sestavu.
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í.
Spropitné
Pokud aktualizujete balíček NuGet, na který vaše aplikace odkazuje nepřímo, a začnete zobrazovat nové chyby, jako jsou FileLoadException, MissingMethodException, TypeLoadExceptionnebo FileNotFoundException, možná budete muset povolit automatické přesměrování vazby nebo ručně přidat přesměrování vazby. To je normální při aktualizaci balíčků NuGet a je výsledkem vytváření některých balíčků proti starší verzi závislosti. Následující výňatek konfiguračního souboru aplikace přidá přesměrování vazby pro balíček 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>
Přesměrování verzí pomocí zásad politiky vydavatele
Dodavatelé komponent mohou přesměrovat aplikace na novější verzi sestavení zahrnutím souboru zásad vydavatele s novým sestavením. Soubor pravidel vydavatele, který se nachází v globální mezipaměti sestavení, obsahuje nastavení přesměrování sestavení.
Každý hlavní.podverze verze 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 je však zaznamenáno v souboru verze 3.0.0.999. Každá hlavní verze .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 Obejít zásady vydavatele.
Přesměrování verzí na úrovni aplikace
Existuje několik různých technik pro změnu chování vazby aplikace prostřednictvím konfiguračního souboru aplikace: můžete ručně upravit soubor, můžete spoléhat na automatické přesměrování vazbynebo můžete určit chování vazby obejít 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 vydá 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>
Spolehněte se na automatické přesměrování vazeb
Když vytvoříte desktopovou aplikaci v Visual Studio, která cílí na .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 silně pojmenovaného sestavení, běhové prostředí automaticky přidá přesměrování vazby na novější verzi sestavení v konfiguračním souboru 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 se nezmění. Řekněme například, že vaše aplikace přímo odkazuje na vzdálenou komponentu .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 při kompilaci pokusí sjednotit sestavení na základě přidaných přesměrování. Ř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 app.config souboru, 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 .NET Frameworku. 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éhoAssembly elementu> v konfiguračním souboru aplikace a nastavte atribut apply na no, které přepíše všechna předchozí nastavení yes.
<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í pro testy, moduly plug-in nebo knihovny používané jinou komponentou
Pro testy byste měli vygenerovat soubor .dll.config. Většina existujících architektur testů jednotek tyto soubory respektuje při načítání testů.
Plug-iny mohou respektovat soubory .dll.config, ale také nemusí. Jediný spolehlivý mechanismus pro přesměrování je poskytování bindingRedirects při vytváření AppDomain.
Můžete se pokusit tento problém vyřešit pomocí obslužných rutin událostí AssemblyResolve, ale to nefunguje, protože tyto obslužné rutiny jsou volána pouze při neúspěšném načtení. Pokud je načtení sestavení úspěšné, ať už bylo načteno jiným sestavením nebo hostitelem, nebo je přítomno v GAC, obslužná rutina AssemblyResolve nebude volána.
Generování přesměrování vazby pro jednotkové testovací projekty
Projekty testů jednotek se kompilují do knihoven DLL, nikoli spustitelných souborů. Automatické generování přesměrování vazby platí jenom pro spustitelné výstupní typy, takže projekty jednotkových testů ve výchozím nastavení nedostávají přesměrování vazby. Pokud projekt testování jednotek odkazuje na sestavení, která mají konfliktní verze, testy mohou za běhu selhat s výjimkami, jako je FileLoadException.
Pokud chcete vygenerovat soubor .dll.config s přesměrováním vazeb pro projekt testování jednotek, přidejte obojí AutoGenerateBindingRedirects i GenerateBindingRedirectsOutputType do souboru projektu.
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
Vlastnost GenerateBindingRedirectsOutputType dává nástroji MSBuild pokyn, aby vygeneroval soubor.dll.config společně s výstupem testovacího sestavení, i když je výstupním typem knihovna tříd (DLL). Většina spouštěčů testů, včetně VSTest, načte tento konfigurační soubor při spouštění testů.
Po přidání těchto vlastností a opětovném sestavení projektu ověřte, že se v výstupním adresáři sestavení vedle testovacího sestavení zobrazí soubor.dll.config . Soubor obsahuje přesměrování vazeb, která jsou potřebná k vyřešení konfliktů verzí sestavení během spuštění testu.
Přesměrování verzí na strojové úrovni
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, jsou směrovány 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 %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 <bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/> určuje, ž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
Pomocí atributu appliesTo na elementu <assemblyBinding> v konfiguračním souboru aplikace můžete přesměrovat odkazy na vazby na konkrétní verzi .NET Frameworku. Tento volitelný atribut používá číslo verze .NET Framework k označení, na jakou verzi se vztahuje. Pokud není zadán žádný atribut appliesTo, platí element <assemblyBinding> pro všechny verze .NET Frameworku.
Například, chcete-li přesměrovat vazbu sestavení pro sestavení .NET Framework 3.5, zahrnuli byste následující kód XML do konfiguračního souboru aplikace.
<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í .NET Framework 3.5, následované sestaveními .NET Framework 4.5. Nakonec zadejte informace o přesměrování vazby sestavení pro jakékoli přesměrování sestavení .NET Framework, které nepoužívá atribut appliesTo, a tudíž 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.
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é
- Postupy: Povolení a zakázání automatického přesměrování vazby
-
<bindingRedirect>Prvek - oprávnění zabezpečení pro přesměrování vazby sestavení
- Sestavy v .NET
- programování se sestaveními
- Jak modul runtime vyhledává sestavení
- Konfigurace aplikací
- schéma nastavení času běhu
- Schéma konfiguračního souboru
- Jak vytvořit zásady vydavatele