Sdílet prostřednictvím


Souběžné spouštění v rozhraní .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 schopnost spouštět na stejném počítači více verzí aplikace nebo komponenty. Můžete mít více verzí modulu CLR (Common Language Runtime) a více verzí aplikací a komponent, které používají verzi modulu runtime, na stejném počítači současně.

Následující obrázek ukazuje několik aplikací používajících dvě různé verze modulu runtime na stejném 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 se skládá z modulu CLR (Common Language Runtime) a kolekce sestavení, která obsahují typy rozhraní API. Modul runtime a sestavení rozhraní .NET Framework jsou verze zvlášť. Například verze 4.0 modulu runtime je ve skutečnosti verze 4.0.319, zatímco verze 1.0 sestavení rozhraní .NET Framework je verze 1.0.3300.0.

Následující obrázek ukazuje několik aplikací používajících dvě různé verze komponenty na stejném počítači. Aplikace A a B používají verzi 1.0 komponenty, 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í poskytuje větší kontrolu nad tím, ke kterým verzím komponenty se aplikace váže, a větší kontrolu nad tím, jakou verzi modulu runtime aplikace používá.

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

Před systémem Windows XP a rozhraním .NET Framework došlo ke konfliktům knihoven DLL, protože aplikace nemohly rozlišovat mezi nekompatibilními verzemi stejného kódu. Informace o typu obsažené v knihovně DLL byly vázány pouze na název souboru. Aplikace neměla žádný způsob, jak zjistit, zda typy obsažené v knihovně DLL byly stejné typy, se kterými byla aplikace vytvořena. V důsledku toho může nová verze komponenty přepsat starší verzi a přerušit aplikace.

Souběžné spouštění a rozhraní .NET Framework poskytují následující funkce, které eliminují konflikty knihoven DLL:

  • Sestavení se silným názvem

    Souběžné spouštění používá sestavení s pevně stanoveným názvem k propojení informací o typu ke specifické verzi sestavení. Tím zabráníte tomu, aby aplikace nebo komponenta byla navázána na neplatnou 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 používat aplikace. Další informace naleznete v tématu Strong-Named sestavení.

  • Úložiště kódu s podporou verzí

    Rozhraní .NET Framework poskytuje úložiště verzovaného kódu v globální mezipaměti sestavení. Globální mezipaměť sestavení 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. Ukládá sestavení na základě informací o verzi, jazykové verzi a vydavateli a podporuje více verzí komponent a aplikací. Další informace najdete v části Globální mezipaměť sestavení.

  • Izolace.

    Pomocí rozhraní .NET Framework můžete vytvářet aplikace a komponenty, které se spouštějí izolovaně. Izolace je základní součástí souběžného spouštění. Zahrnuje povědomí o prostředcích, které používáte, a sdílení prostředků s jistotou mezi několika verzemi aplikace nebo komponenty. Izolace také zahrnuje ukládání souborů způsobem specifickým pro verzi. 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žené tak, aby byly vzájemně kompatibilní. Aplikace sestavená pomocí rozhraní .NET Framework verze 1.0 by měla běžet na verzi 1.1 a aplikace vytvořená pomocí rozhraní .NET Framework verze 1.1 by měla běžet na verzi 1.0. Upozorňujeme však, že funkce rozhraní API přidané ve verzi 1.1 rozhraní .NET Framework nebudou fungovat s verzí 1.0 rozhraní .NET Framework. Aplikace vytvořené s verzí 2.0 se budou spouštět pouze ve verzi 2.0. Aplikace verze 2.0 nebudou fungovat ve verzi 1.1 nebo starší.

Verze rozhraní .NET Framework jsou považovány za jednu jednotku skládající se z modulu runtime a přidružených sestavení rozhraní .NET Framework (koncept označovaný jako sjednocení sestavení). Vazby sestavení můžete přesměrovat tak, aby zahrnovaly jiné verze sestavení rozhraní .NET Framework, ale přepsání výchozí vazby sestavení může být riskantní a musí být důkladně otestováno před nasazením.

Vyhledání informací o verzi modulu runtime

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<> Elementspouš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 runtime podporuje, a také přesměrování sestavení. Ve výchozím nastavení používají COM aplikace, které volají spravovaný kód, nejnovější verzi modulu runtime nainstalovanou v počítači.

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

Určení verze modulu runtime, která se má načíst

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 runtime k načtení na základě následujícího procesu.

  1. Modul runtime prozkoumá prvek <supportedRuntime> v konfiguračním souboru aplikace. Pokud je k dispozici jedna nebo více podporovaných verzí modulu runtime zadaných v <supportedRuntime> elementu, modul runtime načte verzi modulu runtime určenou prvním <supportedRuntime> elementem. 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, jsou prozkoumány další <podporované elementy runtime>. 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é spuš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 prvek <qualifyAssembly> v konfiguračním souboru aplikace k úplné kvalifikaci částečně kvalifikovaných odkazů na sestavení v kódu. K určení pouze polí, která nebyla nastavena v částečné referenci, použijte <qualifyAssembly> element. 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íč tokenu, kultura a verze.

Následující příklad ukazuje položku konfiguračního souboru aplikace pro kompletní kvalifikaci sestavení nazvané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 pro načtení sestavení odkazuje na myAssembly, tato nastavení konfiguračního souboru způsobí, že modul runtime automaticky transformuje částečně kvalifikovaný odkaz myAssembly 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ém provádění.

Titulek Popis
Postupy: Povolení a zakázání automatického přesměrování vazby Popisuje, jak vytvořit vazbu aplikace na konkrétní verzi sestavení.
Konfigurace přesměrování sestavení vazby Vysvětluje, jak přesměrovat odkazy na vazby sestavení na konkrétní verzi souborů rozhraní .NET Framework.
In-Process paralelní spuštění Popisuje, jak můžete použít souběžnou aktivaci hostitele modulu runtime v procesu ke spuštění více verzí MODULU CLR v jednom procesu.
sestavení v rozhraní .NET Poskytuje koncepční přehled sestavení.
Domény aplikací Poskytuje koncepční přehled domén aplikací.

Odkazy

<supportedRuntime> element