Souběžné spouštění v .NET Framework

Poznámka:

Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.

Souběžné spouštění je možnost spuštění několika verzí aplikace nebo komponenty v jednom počítači. V jednom počítači lze nainstalovat více verzí modulu CLR (Common Language Runtime) a několik verzí aplikací a komponent, které využívají verzi modulu runtime ve stejnou dobu.

Následující obrázek znázorňuje několik aplikací, které používají dvě různé verze modulu runtime v jednom počítači. Aplikace A, B a C používají modul runtime verze 1.0, zatímco aplikace D používá modul runtime verze 1.1.

Souběžné spouštění různých verzí modulu runtime

Rozhraní .NET Framework zahrnuje modul CLR (Common Language Runtime) a kolekci sestavení, která obsahují typy rozhraní API. Modul runtime a sestavení rozhraní .NET Framework jsou opatřeny samostatnými verzemi. Například verze 4.0 modulu runtime je ve skutečnosti verzí 4.0.319, zatímco verze 1.0 sestavení rozhraní .NET Framework je verzí 1.0.3300.0.

Následující obrázek znázorňuje několik aplikací, které používají dvě různé verze komponenty na stejném počítači. Aplikace A a B používá verzi komponenty 1.0, zatímco aplikace C používá verzi 2.0 stejné komponenty.

Diagram znázorňující souběžné spuštění komponenty

Souběžné spouštění dává větší kontrolu nad tím, s jakou verzí komponenty je aplikace propojena, a větší kontrolu nad tím, jakou verzi modulu runtime aplikace používá.

Výhody souběžného spouštění

Před příchodem systému Windows XP a rozhraní .NET Framework docházelo ke konfliktům knihoven DLL, protože aplikace nebyla schopna rozlišovat mezi nekompatibilními verzemi stejného kódu. Informace o typu obsažené v knihovně DLL byly propojeny pouze s názvem souboru. Aplikace neměla žádnou možnost zjistit, zda typy obsažené v knihovně DLL jsou stejné jako ty, pomocí kterých byla aplikace sestavena. Ve výsledku mohla nová verze komponenty přepsat starší verzi a aplikace poškodit.

Souběžné spouštění a rozhraní .NET Framework poskytují následující funkce, které pomáhají předcházet konfliktům knihoven DLL:

  • Sestavení se silným názvem.

    Souběžné spouštění používá sestavení se silným názvem k vytvoření vazby informací o typu ke konkrétní verzi sestavení. Díky tomu aplikace nebo součást nevytvoří vazbu k neplatné verzi sestavení. Sestavení se silným názvem také umožňují, aby na stejném počítači existovalo více verzí souboru a aby je mohly využívat aplikace. Další informace naleznete v tématu Sestavení se silným názvem.

  • Úložiště kódu podporující verze.

    Rozhraní .NET Framework poskytuje úložiště kódu podporující verze v globální mezipaměti sestavení (GAC). Globální mezipaměť sestavení (GAC) je mezipaměť kódu pro celý počítač, která je k dispozici na všech počítačích s nainstalovaným rozhraním .NET Framework. Jsou v ní uložena sestavení na základě informací o verzi, jazykové verzi a vydavateli a podporuje více verzí komponent a aplikací. Další informace naleznete v tématu Globální mezipaměť sestavení.

  • Izolace.

    Pomocí rozhraní .NET Framework lze vytvořit aplikace a komponenty, které jsou spouštěny v izolaci. Izolace je základní součástí souběžného spouštění. Zahrnuje znalost prostředků, které využíváte, a zkušenosti se sdílením prostředků napříč několika verzemi aplikace nebo komponenty. Izolace zahrnuje také ukládání souborů na základě verze. Další informace o izolaci naleznete v tématu Pokyny pro vytváření komponent pro souběžné spuštění.

Kompatibilita verzí

Verze 1.0 a 1.1 rozhraní .NET Framework jsou navrženy tak, aby byly navzájem kompatibilní. Aplikaci sestavenou pomocí verze 1.0 rozhraní .NET Framework lze spustit ve verzi 1.1 a aplikaci sestavenou pomocí verze 1.1 rozhraní .NET Framework lze spustit ve verzi 1.0. Funkce rozhraní API, které byly přidány ve verzi 1.1 rozhraní .NET Framework, však nebudou fungovat v rozhraní .NET Framework verze 1.0. Aplikace vytvořené pro verzi 2.0 lze spouštět pouze ve verzi 2.0. Aplikace pro verzi 2.0 nelze spustit ve verzi 1.1 nebo starší.

Verze rozhraní .NET Framework jsou považovány za celek, který sestává z modulu runtime a přidružených sestavení rozhraní .NET Framework (koncept se označuje jako sjednocení sestavení). Vazbu sestavení lze přesměrovat tak, aby zahrnovala další verze sestavení rozhraní .NET Framework. Přepsání výchozích vazeb sestavení však může být nebezpečné a je nutné je před nasazením pečlivě otestovat.

Vyhledání informací o verzi běhového prostředí

Informace o tom, s jakou verzí modulu runtime byla aplikace nebo komponenta zkompilována a které verze modulu runtime, které aplikace vyžaduje ke spuštění, jsou uloženy ve dvou umístěních. Při kompilaci aplikace nebo komponenty jsou informace o verzi modulu runtime použité ke kompilaci uloženy ve spravovaném spustitelném souboru. Informace o verzích modulu runtime, které aplikace nebo komponenta vyžaduje, jsou uloženy v konfiguračním souboru aplikace.

Informace o verzi modulu runtime ve spravovaném spustitelném souboru

Hlavička přenosného spustitelného souboru (PE) každé spravované aplikace a komponenty obsahuje informace o verzi modulu runtime, pomocí které byla vytvořena. Modul CLR (Common Language Runtime) tyto informace používá k určení nejpravděpodobnější verze modulu runtime, který aplikace potřebuje spustit.

Informace o verzi modulu runtime v konfiguračním souboru aplikace

Kromě informací v hlavičce souboru PE je možné aplikaci nasadit s konfiguračním souborem aplikace, který poskytuje informace o verzi modulu runtime. Konfigurační soubor aplikace je soubor založený na jazyce XML, který je vytvořen vývojářem aplikace a který je dodáván s aplikací. RequiredRuntime Element spouštěcího> oddílu<, pokud je v tomto souboru, určuje, které verze modulu runtime a které verze komponenty aplikace podporuje.<> Tento soubor můžete použít také při testování k otestování kompatibility aplikace s různými verzemi modulu runtime.

Nespravovaný kód, včetně aplikací modelu COM a COM+, může obsahovat konfigurační soubory aplikací, které modul runtime používá pro interakci se spravovaným kódem. Konfigurační soubor aplikace ovlivňuje veškerý spravovaný kód, který aktivujete prostřednictvím modelu COM. Soubor může určit, které verze modulu runtime podporuje, a také přesměrování sestavení. Ve výchozím nastavení používají aplikace zprostředkovatele komunikace modelu COM volání do spravovaného kódu nejnovější verzi modulu runtime nainstalovaného v počítači.

Další informace o konfiguračních souborech aplikace najdete v tématu Konfigurace aplikací.

Určení verze běhového prostředí, která má být načtena

Modul CLR (Common Language Runtime) pomocí následujících informací určí, která verze modulu runtime se má pro aplikaci načíst:

  • Dostupné verze modulu runtime.

  • Verze modulu runtime, které aplikace podporuje.

Podporované verze modulu runtime

Modul runtime používá konfigurační soubor aplikace a hlavičku přenosného spustitelného souboru (PE) k určení verze modulu runtime, kterou aplikace podporuje. Pokud není k dispozici žádný konfigurační soubor aplikace, modul runtime načte verzi modulu runtime zadanou v hlavičce souboru PE aplikace, pokud je tato verze k dispozici.

Pokud je k dispozici konfigurační soubor aplikace, modul runtime určí odpovídající verzi modulu runtime, která se má načíst na základě výsledků následujícího procesu:

  1. Modul runtime prozkoumá <podporovaný element ElementRuntime> v konfiguračním souboru aplikace. Pokud je k dispozici jedna nebo více podporovaných verzí modulu runtime zadaných v elementu supportedRuntime>, modul runtime načte verzi modulu runtime určenou prvním <podporovaným elementemRuntime>.< Pokud tato verze není dostupná, modul runtime prozkoumá další <podporovaný elementRuntime> a pokusí se načíst zadanou verzi modulu runtime. Pokud tato verze modulu runtime není k dispozici, prověří se další podporované elementyRuntime>.< Pokud není k dispozici žádná z podporovaných verzí modulu runtime, modul runtime nenačte verzi modulu runtime a zobrazí uživateli zprávu (viz krok 3).

  2. Modul runtime přečte hlavičku souboru PE spustitelného souboru aplikace. Pokud je k dispozici verze modulu runtime zadaná hlavičkou souboru PE, modul runtime tuto verzi načte. Pokud zadaná verze modulu runtime není k dispozici, modul runtime vyhledá verzi modulu runtime určenou Microsoftem, aby byla kompatibilní s verzí modulu runtime v hlavičce PE. Pokud se tato verze nenajde, proces pokračuje krokem 3.

  3. Modul runtime zobrazí zprávu, že verze modulu runtime podporovaná aplikací není k dispozici. Modul runtime není načten.

    Poznámka:

    Zobrazení této zprávy můžete potlačit pomocí hodnoty NoGuiFromShim pod klíčem registru HKLM\Software\Microsoft\. NETFramework nebo použití proměnné prostředí COMPLUS_NoGuiFromShim Můžete například potlačit zprávu pro aplikace, které obvykle nepracují s uživatelem, například bezobslužné instalace nebo služby systému Windows. Když je zobrazení této zprávy potlačeno, modul runtime zapíše zprávu do protokolu událostí. Nastavte hodnotu registru NoGuiFromShim na 1 potlačte tuto zprávu pro všechny aplikace v počítači. Případně nastavte proměnnou prostředí COMPLUS_NoGuiFromShim na hodnotu 1, která potlačí zprávu pro aplikace spuštěné v konkrétním kontextu uživatele.

Poznámka:

Po načtení verze modulu runtime mohou vazby sestavení přesměrovat, že se načte jiná verze individuálního sestavení rozhraní .NET Framework. Tyto přesměrování vazby ovlivňují pouze konkrétní sestavení, které je přesměrováno.

Částečně kvalifikované názvy sestavení a souběžné spouštění

Vzhledem k tomu, že jde o potenciální zdroj souběžných problémů, lze částečně kvalifikované odkazy na sestavení použít pouze k vytvoření vazby na sestavení v adresáři aplikace. Vyhněte se částečně kvalifikovaným odkazům na sestavení v kódu.

Pokud chcete zmírnit částečně kvalifikované odkazy na sestavení v kódu, můžete použít <opravňující prvekAssembly> v konfiguračním souboru aplikace k úplné kvalifikaci částečně kvalifikovaných odkazů na sestavení, ke kterým dochází v kódu. <K určení pouze polí, která nebyla nastavena v částečném odkazu, použijte kvalifikovat ElementAssembly>. Identita sestavení uvedená v atributu fullName musí obsahovat všechny informace potřebné k úplné kvalifikaci názvu sestavení: název sestavení, veřejný klíč, jazykovou verzi a verzi.

Následující příklad ukazuje položku konfiguračního souboru aplikace pro úplnou kvalifikaci sestavení volaného myAssembly.

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="myAssembly"
fullName="myAssembly,
      version=1.0.0.0,
publicKeyToken=...,
      culture=neutral"/>
</assemblyBinding>

Kdykoli příkaz načtení sestavení odkazuje myAssembly, tato nastavení konfiguračního souboru způsobí, že modul runtime automaticky přeloží částečně kvalifikovaný myAssembly odkaz na plně kvalifikovaný odkaz. Například Assembly.Load("myAssembly") se stane Assembly.Load("myAssembly; version=1.0.0.0, publicKeyToken=..., culture=neutral").

Poznámka:

Metodu LoadWithPartialName můžete použít k obejití omezení modulu CLR (Common Language Runtime), které zakazuje načtení částečně odkazovaných sestavení z globální mezipaměti sestavení. Tato metoda by se měla používat pouze ve scénářích vzdálené komunikace, protože může snadno způsobit problémy při souběžné provádění.

Titulek Popis
Postupy: Povolení a zákaz automatického přesměrování vazby Popisuje způsob propojení aplikace s konkrétní verzí sestavení.
Konfigurace přesměrování vazby sestavení Objasňuje způsob, jakým lze odkazy vazby přesměrovat na určitou verzi sestavení rozhraní .NET Framework.
Vnitroprocesové souběžné provádění Popisuje způsob používání souběžného spouštění aktivace hostitele v jednom procesu, který je určen pro spouštění více verzí modulu CLR (Common Language Runtime) v rámci jednoho procesu.
Sestavení v .NET Poskytuje koncepční přehled sestavení.
Aplikační domény Poskytuje koncepční přehled domén aplikací.

Reference

<supportedRuntime> – element