Métadonnées et structure des fichiers PE
Les métadonnées sont stockées dans une section du fichier exécutable portable (fichier PE) .NET Framework, tandis que le code MSIL (Microsoft Intermediate Language) est stocké dans une autre section. La partie métadonnées du fichier contient un ensemble de structures de données de table et de tas. La partie MSIL contient le code MSIL et les jetons de métadonnées qui font référence à la partie métadonnées du fichier PE. Vous pouvez rencontrer des jetons de métadonnées quand vous utilisez des outils comme MSIL Disassembler (Ildasm.exe) pour afficher le code MSIL de votre propre code ou Runtime Debugger (Cordbg.exe) pour générer une image mémoire.
Chaque table de métadonnées contient des informations sur les éléments de votre programme. Par exemple, une table de métadonnées décrit les classes de votre code, une autre décrit les champs, etc. Si vous disposez de dix classes dans votre code, la table des classes aura dix lignes, une par classe. Les tables de métadonnées font référence à d'autres tables et d'autres tas. Par exemple, la table des métadonnées pour les classes fait référence à la table pour les méthodes.
Les métadonnées stockent aussi des informations dans quatre structures de tas : chaîne, blob, chaîne utilisateur et un Identificateur Global Unique (GUID, Globally Unique IDentifier). Toutes les chaînes utilisées pour nommer les types et les membres sont stockées dans le tas de chaîne. Par exemple, une table de méthodes ne stocke pas directement le nom d'une méthode particulière, mais pointe vers le nom de la méthode stocké dans le tas de chaîne.
Chaque ligne des tables de métadonnées est identifiée de façon unique dans la partie MSIL du fichier PE au moyen d'un jeton de métadonnées. Conceptuellement, les jetons de métadonnées sont similaires à des pointeurs, persistants dans le langage MSIL, qui font référence à une table de métadonnées spécifique.
Un jeton de métadonnées est un nombre stocké sur quatre octets. L'octet de poids le plus fort identifie la table de métadonnées à laquelle un jeton donné fait référence (méthode, type, etc.). Les trois octets restants spécifient la ligne de la table de métadonnées qui correspond à l'élément de programmation en cours de description. Si vous définissez une méthode en C# et la compilez dans un fichier PE, le jeton de métadonnées suivant figurera probablement dans la partie MSIL du fichier PE :
0x06000004
L'octet de poids le plus fort (0x06
) indique qu'il s'agit d'un jeton MethodDef. Les trois autres octets (000004
) indiquent au Common Language Runtime de rechercher dans la quatrième ligne de la table MethodDef les informations décrivant la définition de cette méthode.
Quand un programme est compilé pour le Common Language Runtime, il est converti en fichier PE, composé de trois parties. Le tableau ci-après décrit le contenu de chaque partie.
Section PE | Contenu de la section PE |
---|---|
En-tête PE |
L'index des sections principales du fichier PE et l'adresse du point d'entrée. Le runtime utilise ces informations pour identifier le fichier comme fichier PE et pour déterminer où commence l'exécution lors du chargement du programme en mémoire. |
Instructions MSIL |
Les instructions MSIL (Microsoft Intermediate Language) composant votre code. Nombre d'instructions MSIL sont accompagnées de jetons de métadonnées. |
Métadonnées |
Tas et tables de métadonnées. Le runtime utilise cette section pour enregistrer les informations sur chaque type et membre de votre code. Cette section contient aussi des attributs personnalisés et des informations de sécurité. |