Proces spravovaného spouštění

Proces spravovaného spouštění zahrnuje následující kroky, které jsou detailně popsány dále v tomto tématu:

  1. Volba kompilátoru.

    Chcete-li získat výhody poskytované modulem CLR (Common Language Runtime), je nutné použít jeden nebo více kompilátorů jazyka, které se zaměřují na modul runtime.

  2. Kompilace kódu do jazyka MSIL.

    Kompilace převádí váš zdrojový kód do jazyka MSIL (Microsoft Intermediate Language) a generuje požadovaná metadata.

  3. Kompilace jazyka MSIL do nativního kódu.

    V době spuštění přeloží JIT kompilátor jazyk MSIL do nativního kódu. Během této kompilace je nutné, aby kód prošel procesem ověření, který prověří jazyk MSIL a metadata a zjistí, zda kód může být určen jako typově bezpečný.

  4. Spuštěný kód.

    Modul CLR (Common Language Runtime) poskytuje infrastrukturu, která umožňuje uskutečnit spuštění a služby, které lze použít během provádění.

Volba kompilátoru

Pro získání výhod poskytovaných modulem CLR (Common Language Runtime) je nutné použít jeden nebo více kompilátorů jazyka, které se zaměřují na modul runtime, například Visual Basic, C#, Visual C++, F # nebo jeden z mnoha kompilátorů třetí strany například Eiffel, Perl nebo COBOL kompilátor.

Protože jde o vícejazyčné prostředí pro provádění, modul runtime podporuje širokou škálu datových typů a vlastností jazyka. Použitý kompilátor jazyka určuje, které vlastnosti modulu runtime jsou k dispozici a vy navrhnujete váš kód s pomocí těchto vlastností. Vaš kompilátor, nikoliv runtime modul stanovuje syntaxi kódu, kterou musí váš kód používat. Pokud je nutné, aby komponenta byla zcela použitelná komponentami napsanými v jiných jazycích, tak exportované typy vaší komponenty musí vystavit pouze ty vlastnosti jazyka, které jsou součástí Specifikace CLS (Common Language Specification) (specifikace CLS). Můžete použít atribut CLSCompliantAttribute k zajištění, že váš kód odpovídá specifikaci CLS. Další informace naleznete v tématu Zápis kódu odpovídajícího specifikaci CLS.

Zpět na začátek

Kompilace do jazyka MSIL

Při kompilaci spravovaného kódu kompilátor převádí zdrojový kód do jazyka MSIL (Microsoft Intermediate Language), což je sada instrukcí nezávislá na procesoru, které mohou být efektivně převedeny do nativního kódu. Jazyk MSIL obsahuje pokyny pro načítání, ukládání, inicializaci a volání metod na objekty, taktéž i pokyny pro aritmetické a logické operace, tok řízení, přímý přístup do paměti (DMA), zpracování výjimek a jiné operace. Před spuštěním kódu je nutné, aby jazyk MSIL byl převeden do kódu specifického pro procesor, obvykle pomocí kompilátoru just-in-time (JIT). Vzhledem k tomu, že modul CLR (Common Language Runtime) poskytuje jeden nebo více JIT kompilátorů pro každou počítačovou architekturu, kterou podporuje, tak stejná sada MSIL může být zkompilována pomocí JIT kompilátoru a běžet na jakékoliv podporované architektuře.

Když kompilátor vytváří MSIL kód, vytváří také metadata. Metadata popisují typy ve vašem kódu, včetně definice každého typu, signatury členů každého typu, členy odkazující na váš kód a jiná data, která modul runtime používá v době provádění. MSIL kód a metadata jsou obsaženy v přenositelném spustitelném souboru (PE), který rozšiřuje a je založen na publikovaném Microsoft PE a formátu COFF (Common Object File Format), který je historicky používaný pro spustitelný obsah. Tento formát souboru, který přizpůsobuje MSIL nebo nativní kód stejně jako metadata, umožňuje operačnímu systému rozpoznat bitové kopie modulu CLR (Common Language Runtime). Přítomnost metadat v souboru společně s MSIL umožňuje kódu popsat sám sebe, což znamená, že není potřeba knihoven typů nebo IDL (Interface Definition Language). Modul runtime vyhledá a vyjme metadata ze souboru podle potřeby v průběhu provádění.

Zpět na začátek

Kompilace MSIL do nativního kódu

Před spuštěním jazyka MSIL (Microsoft Intermediate Language) je nutné, aby byl zkompilován proti modulu CLR (Common Language Runtime) do nativního kódu architektury cílového počítače. Rozhraní .NET Framework poskytuje dva způsoby provedení této konverze:

Kompilace pomocí JIT kompilátoru

Kompilace JIT převede jazyk MSIL do nativního kódu na požádání v době běhu aplikace, když obsah sestavení je načten a vykonán. Protože modul CLR (Common Language Runtime) dodává JIT kompilátor pro každou podporovanou architekturu procesoru, mohou vývojáři vytvářet sady sestavení jazyka MSIL, které mohou být zkompilovány za běhu (JIT) a mohou běžet v různých počítačích s různou architekturou. Nicméně pokud spravovaný kód volá nativní API rozhraní specifické pro konkrétní platformu nebo knihovnu tříd specifickou pro konkrétní platformu, bude kód spuštěn pouze v daném operačním systému.

Kompilace JIT bere v úvahu možnost, že některý kód nemusí být nikdy volán během provádění. Místo použivání času a paměti k převedení všech instrukcí jazyka MSIL v přenositelném spustitelném souboru do nativního kódu, převádí jazyk MSIL podle potřeby během provádění a uloží výsledný nativní kód v paměti tak, aby byl přístupný pro pozdější volání v rámci tohoto procesu. Zavaděč vytvoří a připojí zástupný objekt ke každé metodě v typu, když je typ načten a inicializován. Když je metoda volána poprvé, zástupný objekt předá kontrolu JIT kompilátoru, který převede jazyk MSIL pro danou metodu do nativního kódu a upraví zástupný objekt tak, aby ukazoval přímo do generovaného nativního kódu. Proto následné volání za běhu zkompilované metody přechází přímo na nativní kód.

Generování kódu pomocí NGEN.EXE v době instalace

Protože kompilátor JIT převede instrukce jazyka MSIL náležící sestavení do nativního kódu, v momentě kdy jsou jednotlivé metody definované v sestavení volány, tak to nepříznivě ovlivňuje výkon v době běhu. Ve většině případů je snížení výkonu přijatelné. Důležitější je, že kód generovaný JIT kompilátorem je vázán k procesu, který spustil kompilaci. Nemůže být sdílen napříč více procesy. Aby bylo možné sdílet generovaný kód mezi několika vyvoláními aplikace, nebo mezi několika procesy, které sdílejí stejnou množinu sestavení , modul CLR (Common Language runtime) podporuje režim předčasné kompilace. Tento režim předčasné kompilace používá Ngen.exe (Native Image Generator) k převédení instrukcí MSIL náležících sestavením do nativního kódu podobně jako JIT kompilátor. Nicméně činnost Ngen.exe se od JIT kompilátoru liší třemi způsoby:

  • Provádí převod z MSIL do nativního kódu před spuštěním aplikace místo toho, aby převod realizoval když aplikace běží.

  • Kompiluje celé sestavení najednou, namísto jedné metody najednou.

  • Uchovává generovaný kód v mezipaměti pro nativní bitové kopie jako soubor na disku.

Ověření kódu

Jako část kompilace do nativního kódu, je nutné aby kód jazyka MSIL prošel procesem ověření, pokud správce nevytvořil zásady zabezpečení, které umožňují obejít ověření kódu. Ověření kontroluje MSIL a metadata kvůli zjištění, zda je kód typově bezpečný, což znamená, že přistupuje pouze k paměťovým místům, ke kterým má oprávnění k přístupu. Bezpečnost typů pomáhá izolovat objekty od ostatních objektů a pomáhá je chránit před neúmyslným nebo zákeřným poškozením. Poskytuje také ujištění, že bezpečnostní omezení kódu mohou být spolehlivě vykonána.

Modul runtime se opírá o fakt, že následující výroky jsou pravdivé pro kód, který je prokazatelně typově bezpečný:

  • Odkaz na typ je striktně kompatibilní s odkazovaným typem.

  • Pouze vhodně definované operace jsou vyvolány na objektu.

  • Identity jsou tím, čím tvrdí že jsou.

Během ověřovacího procesu je kód jazyka MSIL zkoumán ve snaze potvrdit, že kód může přistupovat k částem paměti a volat metody pouze prostřednictvím správně definovaných typů. Například kód nemůže povolit položkám objektu, aby byly přístupné takovým způsobem, který umožňuje přetečení částí paměti. Navíc ověření kontroluje kód za účelem určení, zda MSIL kód byl správně vygenerován, protože nesprávný MSIL kód může vést k narušení pravidel bezpečnosti typu. Ověřovací proces předává dobře definovanou sadu kódu zajišťujícího bezpečnost typů a předává pouze kód, který je typově bezpečný. Nicméně některý kód zajišťující bezpečnost typů nemusí projít ověřením z důvodu některých omezení ověřovacího procesu a některé jazyky, záměrně neprodukují kód prokazatelně zajišťující bezpečnost typů. Pokud kód zajišťující bezpečnost typů je vyžadován zásadami zabezpečení, ale neprojde ověřením, je při spuštění kódu vyvolána výjimka.

Zpět na začátek

Spuštěný kód

Modul CLR (Common Language Runtime) poskytuje infrastrukturu, která umožňuje spravovat provádění a služby, které lze během provádění použít. Před spuštěním metody je nutné, aby byla zkompilován do kódu specifického pro procesor. Každá metoda, pro kterou byl vygenerován MSIL kód je kompilována JIT kompilátorem, pokud je volána poprvé a poté spuštěna. Příště, když je metoda spuštěna, tak je spuštěn existující nativní kód zkompilovaný pomocí JIT kompilátoru. Proces JIT kompilace a následné spouštění kódu se opakuje až do dokončení provádění.

Během provádění obdrží spravovaný kód služby, jako je například uvolňování paměti, zabezpečení, spolupráce s nespravovaným kódem, podpora ladění mezi jazyky, vylepšené nasazení a podpora správy verzí.

V operačním systému Windows XP a Windows Vista zavaděč kontroluje spravované moduly zkoumáním bitu v hlavičce souboru COFF. Nastavený bit označuje spravovaný modul. Pokud zavaděč odhalí spravované moduly, načte mscoree.dll nebo _CorValidateImage nebo _CorImageUnloading upozorní zavaděč když bitové kopie spravovaného modulu jsou načteny nebo uvolněny. _CorValidateImage provede následující akce:

  1. Zajišťuje, že kód je platný spravovaný kód.

  2. Mění vstupní bod v bitové kopii na vstupní bod v modulu runtime.

V 64bitovém systému Windows _CorValidateImage modifikuje bitovou kopii, která je v paměti pomocí její transformace z PE32 na PE32+ formát.

Zpět na začátek

Viz také

Odkaz

Ilasm.exe (MSIL Assembler)

Koncepty

Specifikace CLS (Common Language Specification)

Metadata a komponenty popisující samy sebe

Deploying the .NET Framework

Sestavení v modulu CLR (Common Language Runtime)

Domény aplikace

Hostitelská prostředí modulu runtime

Další zdroje

Přehled rozhraní .NET Framework

Zabezpečení v rozhraní .NET Framework

Interoperating with Unmanaged Code