Sdílet prostřednictvím


Proces spravovaného spouštění

Spravovaný proces provádění zahrnuje následující kroky, které jsou podrobně popsány dále v tomto tématu:

  1. Výběr kompilátoru Pokud chcete získat výhody poskytované modulem CLR (Common Language Runtime), musíte použít jeden nebo více kompilátorů jazyků, které cílí na modul runtime.
  2. Kompilace kódu do mezijazyka Kompilace přeloží zdrojový kód do společného zprostředkujícího jazyka (CIL) a vygeneruje požadovaná metadata.
  3. Kompilace souboru CIL do nativního kódu V době spuštění kompilátor JIT (just-in-time) přeloží CIL do nativního kódu. Během této kompilace musí kód projít ověřovacím procesem, který prozkoumá CIL a metadata, aby zjistil, zda je možné kód určit jako typově bezpečný.
  4. Spuštění kódu Modul CLR (Common Language Runtime) poskytuje infrastrukturu, která umožňuje provádět provádění, a služby, které je možné použít během provádění.

Volba kompilátoru

Pokud chcete získat výhody poskytované modulem CLR (Common Language Runtime), musíte použít jeden nebo více kompilátorů jazyka, které cílí na modul runtime, jako je Visual Basic, C#, Visual C++, F# nebo jeden z mnoha kompilátorů třetích stran, jako je kompilátor Eiffel, Perl nebo COBOL.

Vzhledem k tomu, že se jedná o prostředí pro spouštění s více jazyky, modul runtime podporuje širokou škálu datových typů a jazykových funkcí. Kompilátor jazyka, který používáte, určuje, které funkce modulu runtime jsou k dispozici, a navrhnete kód pomocí těchto funkcí. Kompilátor, nikoli modul runtime, vytváří syntaxi, která musí váš kód použít. Pokud musí být komponenta zcela použitelná komponentami napsanými v jiných jazycích, musí exportované typy vaší komponenty vystavit pouze jazykové funkce, které jsou součástí specifikace CLS (Common Language Specification). Pomocí atributu CLSCompliantAttribute můžete zajistit, aby váš kód dodržoval předpisy CLS. Další informace naleznete v tématu Jazyková nezávislost a komponenty nezávislé na jazyce.

Kompilace do CIL

Při kompilaci do spravovaného kódu kompilátor přeloží zdrojový kód do společného zprostředkujícího jazyka (CIL), což je sada instrukcí nezávislá na procesoru, která se dá efektivně převést na nativní kód. CIL obsahuje pokyny pro načítání, ukládání, inicializaci a volání metod u objektů a také pokyny pro aritmetické a logické operace, tok řízení, přímý přístup k paměti, zpracování výjimek a další operace. Před spuštěním kódu musí být kód CIL převeden na kód specifický pro procesor, obvykle kompilátorem JIT (just-in-time). Vzhledem k tomu, že modul CLR (Common Language Runtime) poskytuje jeden nebo více kompilátorů JIT pro každou architekturu počítače, které podporuje, může být stejná sada CIL zkompilovaná a spuštěná v jakékoli podporované architektuře.

Když kompilátor vytvoří soubor CIL, vytvoří také metadata. Metadata popisují typy v kódu, včetně definice každého typu, podpisů členů jednotlivých typů, členů, na které odkazuje váš kód, a dalších dat, která modul runtime používá při spuštění. CIL a metadata jsou obsaženy v přenosném spustitelném souboru (PE), který je založen na a rozšiřuje publikované specifikace Microsoft PE a společný formát souboru objektu (COFF), které se historicky používaly pro spustitelný obsah. Tento formát souboru, který dokáže zpracovávat jak CIL, tak nativní kód i metadata, umožňuje operačnímu systému rozpoznat obrazy CLR (Common Language Runtime). Přítomnost metadat v souboru společně se souborem CIL umožňuje, aby se váš kód popsal sám, což znamená, že není nutné používat knihovny typů ani jazyk IDL (Interface Definition Language). Modul runtime vyhledá a extrahuje metadata ze souboru podle potřeby během provádění.

Kompilace CIL do nativního kódu

Než budete moct spustit běžný mezikód (CIL), musí být zkompilován pomocí rozhraní CLR (Common Language Runtime) do nativního kódu pro architekturu cílového počítače. .NET nabízí dva způsoby provedení tohoto převodu:

Kompilace kompilátorem JIT

Kompilace JIT převede CIL na nativní kód na vyžádání za běhu aplikace, když se načte a spustí obsah sestavení. Vzhledem k tomu, že modul CLR (Common Language Runtime) poskytuje kompilátor JIT pro každou podporovanou architekturu procesoru, můžou vývojáři vytvořit sadu sestavení CIL, která můžou být zkompilovaná a spuštěná na různých počítačích s různými architekturami počítačů. Pokud ale spravovaný kód volá nativní rozhraní API specifická pro danou platformu nebo knihovnu tříd specifických pro danou platformu, spustí se pouze v daném operačním systému.

Kompilace JIT bere v úvahu možnost, že se během provádění nemusí volat nějaký kód. Místo použití času a paměti k převodu všech CIL v souboru PE na nativní kód převede CIL podle potřeby a uloží výsledný nativní kód do paměti tak, aby byl přístupný pro následná volání v kontextu tohoto procesu. Načítací modul vytvoří a připojí zástupný kód pro každou metodu typu, když je typ načten a inicializován. Při prvním zavolání metody předá zástupný kód řízení kompilátoru JIT, který převede CIL pro tuto metodu na nativní kód a upraví zástupný znak tak, aby odkazoval přímo na vygenerovaný nativní kód. Proto následná volání metody zkompilované pomocí JIT přecházejí přímo k nativnímu kódu.

Generování kódu v čase instalace pomocí NGen.exe

Vzhledem k tomu, že kompilátor JIT převede soubor CIL sestavení na nativní kód, když jsou volány jednotlivé metody definované v daném sestavení, má negativní vliv na výkon za běhu. Ve většině případů je snížení výkonu přijatelné. Důležitější je, že kód vygenerovaný kompilátorem JIT je vázán na proces, který aktivoval kompilaci. Nejde ho sdílet napříč několika procesy. Aby se vygenerovaný kód sdílel napříč několika vyvoláním aplikace nebo napříč několika procesy, které sdílejí sadu sestavení, podporuje modul CLR (Common Language Runtime) režim kompilace předem. Tento režim kompilace předem používá Ngen.exe (Generátor nativních imagí) k převodu sestavení CIL na nativní kód podobně jako kompilátor JIT. Operace Ngen.exe se ale liší od operace kompilátoru JIT třemi způsoby:

  • Provádí převod z CIL na nativní kód před spuštěním aplikace místo spuštění aplikace v době, kdy je aplikace spuštěná.
  • Zkompiluje celé sestavení najednou místo jedné metody najednou.
  • Vygenerovaný kód se ukládá v mezipaměti nativní bitové kopie jako soubor na disku.

Ověření kódu

V rámci kompilace do nativního kódu musí kód CIL předat ověřovací proces, pokud správce nenastavil zásady zabezpečení, které kódu umožňují obejít ověření. Ověření prozkoumá CIL a metadata a zjistí, jestli je kód bezpečný, což znamená, že přistupuje pouze k umístěním paměti, ke kterým má oprávnění pro přístup. Bezpečnost typů pomáhá izolovat objekty od sebe a pomáhá je chránit před neúmyslným nebo škodlivým poškozením. Poskytuje také záruku, že bezpečnostní omezení kódu lze spolehlivě vynutit.

Modul runtime spoléhá na skutečnost, že následující příkazy jsou pravdivé pro kód, který je ověřitelně typově bezpečný:

  • Odkaz na typ je přísně kompatibilní s odkazovaným typem.
  • Na objektu se vyvolávají pouze správně definované operace.
  • Identity jsou takové, jaké tvrdí, že jsou.

Během procesu ověření se kód CIL zkoumá při pokusu o potvrzení, že kód má přístup k umístěním paměti a volání metod pouze prostřednictvím správně definovaných typů. Například kód nesmí zpřístupnit pole objektu způsobem, který může způsobit přetečení paměťových oblastí. Kromě toho ověření kontroluje kód, aby zjistilo, zda byl CIL správně vygenerován, protože chybný CIL může vést k porušení pravidel bezpečnosti typů. Proces ověření předá dobře definovanou sadu kódu bezpečného typu a předá pouze kód, který je typu bezpečný. Některé kódy bezpečné pro typ ale nemusí projít ověřením kvůli určitým omezením procesu ověřování a některé jazyky záměrně nevytvářejí ověřitelný typově bezpečný kód. Pokud zásady zabezpečení vyžadují typově bezpečný kód, ale kód neprojde ověřením, při spuštění kódu se vyvolá výjimka.

Spuštění kódu

Modul CLR (Common Language Runtime) poskytuje infrastrukturu, která umožňuje provádět spravované spouštění, a služby, které je možné použít během provádění. Před spuštěním metody je nutné ji zkompilovat do kódu specifického pro procesor. Každá metoda, pro kterou byl vygenerován CIL, je při prvním zavolání JIT-kompilována a poté spuštěna. Při příštím spuštění metody se spustí stávající nativní kód zkompilovaný JIT. Proces kompilace JIT a následné spuštění kódu se opakuje, dokud se provádění neskončí.

Během provádění získává spravovaný kód služby, jako je uvolňování paměti, zabezpečení, interoperabilita s nespravovaným kódem, podpora ladění napříč jazyky a rozšířená podpora nasazení a správy verzí.

V systému Microsoft Windows Vista zavaděč operačního systému kontroluje spravované moduly zkoumáním bitu v hlavičce COFF. Bit, který se nastavuje, označuje spravovaný modul. Pokud zavaděč zjistí spravované moduly, načte mscoree.dlla upozorní _CorValidateImage_CorImageUnloading zavaděč při načtení a uvolnění imagí spravovaných modulů. _CorValidateImage provede následující akce:

  1. Zajišťuje, že je kód platný a spravovaný.
  2. Změní vstupní bod na obrázku na vstupní bod v modulu runtime.

V 64bitovém systému Windows _CorValidateImage upraví image, která je v paměti, tím, že ji transformuje z formátu PE32 na formát PE32+.

Viz také