Condividi tramite


I metadati e la struttura dei file PE

I metadati vengono memorizzati in una sezione di un file eseguibile portabile (PE, Portable Executable) .NET Framework, mentre il codice Microsoft Intermediate Language (MSIL) viene memorizzato in una diversa sezione dello stesso file. La parte del file che ospita i metadati contiene una serie di tabelle e di strutture di dati dell'heap. La parte MSIL contiene codice MSIL e token di metadati che fanno riferimento alla parte del file PE che ospita i metadati. I token dei metadati vengono utilizzati, ad esempio, con strumenti come il disassemblatore MSIL (Ildasm.exe), che consente di visualizzare il proprio codice MSIL.

Tabelle e heap dei metadati

Ogni tabella dei metadati contiene informazioni sugli elementi di un programma. Ad esempio, una tabella dei metadati descrive le classi presenti nel codice, un'altra tabella descrive i campi e così via. Se il codice contiene dieci classi, la tabella delle classi sarà costituita da dieci righe, una per ogni classe. Le tabelle dei metadati fanno riferimento ad altre tabelle e agli heap. La tabella dei metadati che elenca le classi contiene ad esempio riferimenti alla tabella che elenca i metodi.

I metadati memorizzano informazioni anche in quattro strutture heap: stringhe, blob, stringhe utente e GUID. Tutte le stringhe utilizzate per denominare i tipi e i membri sono memorizzate nell'heap delle stringhe. La tabella dei metodi, ad esempio, non memorizza il nome dei metodi direttamente, ma punta al nome del metodo memorizzato nell'heap delle stringhe.

Token di metadati

Ciascuna riga di ciascuna tabella dei metadati è identificata in modo univoco nella parte MSIL del file PE da un token di metadati. I token di metadati sono concettualmente simili a puntatori, memorizzati in MSIL, che fanno riferimento a una determinata tabella dei metadati.

Un token di metadati è un numero a quattro byte. Il byte più significativo indica la tabella dei metadati a cui il token fa riferimento (metodi, tipi e così via). I rimanenti tre byte individuano la riga della tabella dei metadati che corrisponde all'elemento di programmazione che si sta descrivendo. Se si definisce un metodo in C# e lo si compila in un file PE, si potrà trovare il seguente token di metadati nella parte MSIL del file PE:

 0x06000004

Il byte più significativo (0x06) indica che si tratta di un token MethodDef. I tre byte meno significativi (000004) indicano a Common Language Runtime di cercare le informazioni che descrivono la definizione di questo metodo nella quarta riga della tabella MethodDef.

Metadati all'interno di un file PE

Quando un programma viene compilato per Common Language Runtime, viene convertito in un file PE, costituito da tre parti. Nella tabella che segue viene descritto il contenuto di ciascuna parte.

Sezione del PE

Contenuto

Intestazione del PE

L'indice delle sezioni principali del file PE e l'indirizzo del punto di ingresso.

Il runtime utilizza queste informazioni per identificare il file come file PE e per determinare da che punto iniziare l'esecuzione quando carica il programma in memoria.

Istruzioni MSIL

Le istruzioni MSIL che costituiscono il codice. Molte istruzioni MSIL sono accompagnate da token di metadati.

Metadati

Le tabelle e gli heap dei metadati. Il runtime utilizza questa sezione per memorizzare informazioni sui tutti i tipi e i membri presenti nel codice. Questa sezione include anche attributi personalizzati e informazioni sulla sicurezza.

Vedere anche

Concetti

Metadati e componenti auto-descrittivi