Metadata a struktura přenositelného spustitelného souboru
Metadata jsou uložena v jednom oddíle přenositelného spustitelného souboru (PE) rozhraní .NET Framework, kdežto jazyk MSIL (Microsoft Intermediate Language) je uložen v jiném oddíle přenositelného spustitelného souboru. Část souboru metadat obsahuje řadu tabulek a hald datových struktur. Část souboru s jazykem MSIL obsahuje jazyk MSIL a tokeny metadat, které odkazují na část přenositelného spustitelného souboru s metadaty. Když používáte nástroje, jako je například MSIL Disassembler (Ildasm.exe) pro zobrazení vašeho MSIL kódu, můžete narazit na tokeny metadat.
Tabulky a haldy metadat
Každá tabulka metadat uchovává informace o elementech programu. Například jedna tabulka metadat popisuje třídy v kódu, jiná tabulka popisuje položky a tak dále. Pokud máte ve svém kódu deset tříd, tabulka tříd bude obsahovat deset řádků, jeden pro každou třídu. Tabulky metadat odkazují na jiné tabulky a haldy. Například tabulka metadat pro třídy odkazuje na tabulku pro metody.
Metadata také ukládají informace do čtyř struktur haldy: řetězec, blob, uživatelský řetězec a identifikátor GUID. Všechny řetězce použité k pojmenování typů a členů jsou uloženy v haldě řetězce. Například tabulka metody přímo neukládá název konkrétní metody, ale odkazuje na název metody, který je uložený v haldě řetězce.
Tokeny metadat
Každý řádek každé tabulky metadat je jednoznačně identifikovaný v části přenositelného spustitelného souboru pro jazyk MSIL pomocí tokenu metadat. Tokeny metadat jsou koncepčně podobné ukazatelům uloženým v MSIL, které odkazují na konkrétní tabulku metadat.
Token metadat je čtyř bajtové číslo. Horní byte označuje tabulku metadat, na kterou konkrétní token odkazuje (metoda, typ atd.). Zbývající tři bajty specifikují řádek v tabulce metadat, který odpovídá popisovanému programovacímu prvku. Pokud definujete metodu v jazyce C# a kompilujte ji do přenositelného spustitelného souboru, tak následující token metadat může existovat v části přenositelného spustitelného souboru pro jazyk MSIL:
0x06000004
Horní byte (0x06) označuje, že tohle je MethodDef token. Nižší tři bajty (000004) sdělují modulu CLR (Common Language Runtime), aby se podíval do čtvrtého řádku tabulky MethodDef pro informaci, která popisuje definici této metody.
Metadata uvnitř přenositelného spustitelného souboru
Když je program kompilován pro modul CLR (Common Language Runtime), je převeden na přenositelný spustitelný soubor, který se skládá ze tří částí. Následující tabulka popisuje obsah každé části.
PE oddíl |
Obsah PE oddílu |
---|---|
PE hlavička |
Index hlavních částí přenositelných spustitelných souborů (PE) a adresa vstupního bodu. Runtime modul používá tyto informace pro identifikaci souboru jako přenositelného spustitelného souboru a k určení, kde začít provádění při načítání programu do paměti. |
Instrukce jazyka MSIL |
Instrukce jazyka MSIL (Microsoft Intermediate Language), které tvoří váš kód. Mnoho MSIL instrukcí je doprovázeno tokeny metadat. |
Metadata |
Tabulky a haldy metadat. Modul runtime používá tento oddíl k zaznamenání informací o každém typu a členu ve vašem kódu. Tato část také obsahuje vlastní atributy a informace o zabezpečení. |