Metadaten und die PE-Dateistruktur
Metadaten werden in einem Bereich einer .NET Framework-PE (Portable Executable)-Datei gespeichert, während MSIL (Microsoft Intermediate Language) in einem anderen Bereich der PE-Datei gespeichert wird. Der Metadatenbereich der Datei enthält eine Reihe von Tabellen und Heapdatenstrukturen. Der MSIL-Bereich enthält MSIL und Metadatentokens, die auf den Metadatenbereich der PE-Datei verweisen. Möglicherweise stoßen Sie auf Metadatentokens, wenn Sie das MSIL Disassembler-Tool (Ildasm.exe) verwenden, um die MSIL Ihres Codes anzuzeigen, bzw. das Runtime Debugger-Tool (Cordbg.exe), um einen Speicherdump durchzuführen.
Metadatentabellen und -heaps
Jede Metadatentabelle beinhaltet Informationen über die Elemente Ihres Programms. Eine Metadatentabelle beschreibt zum Beispiel die Klassen des Codes, eine andere beschreibt die Felder usw. Falls der Code z. B. zehn Klassen besitzt, enthält die Klassentabelle zehn Zeilen, eine für jede Klasse. Metadatentabellen verweisen auf andere Tabellen und Heaps. Die Metadatentabelle für Klassen verweist z. B. auf die Tabelle für Methoden.
Zusätzlich speichern Metadaten Informationen in vier Heapstrukturen: Zeichenfolge, BLOB, Benutzerzeichenfolge und GUID. Alle Zeichenfolgen zum Benennen von Typen und Membern werden im Stringheap gespeichert. Eine Methodentabelle speichert den Namen einer bestimmten Methode nicht direkt, sondern verweist auf dem im Stringheap gespeicherten Namen einer Methode.
Metadatentokens
Jede Zeile einer Metadatentabelle wird im MSIL-Bereich einer PE-Datei durch ein Metadatentoken eindeutig identifiziert. Metadatentokens sind konzeptionell identisch mit in MSIL beibehaltenen Zeigern, die auf eine bestimmte Metadatentabelle verweisen.
Ein Metadatentoken ist eine Vier-Byte-Zahl. Das oberste Byte kennzeichnet die Metadatentabelle, auf die ein bestimmtes Token verweist (Methode, Typ usw.). Die restlichen drei Bytes geben die Zeile in der Metadatentabelle an, die dem beschriebenen Programmierelement entspricht. Wenn Sie eine Methode in C# definieren und in eine PE-Datei kompilieren, befindet sich möglicherweise folgendes Metadatentoken im MSIL-Bereich der PE-Datei:
0x06000004
Das oberste Byte (0x06
) gibt an, dass es sich um ein MethodDef-Token handelt. Die unteren drei Bytes (000004
) weisen Common Language Runtime an, in der vierten Zeile der MethodDef-Tabelle nach Informationen zu suchen, welche die Methodendefinition beschreiben.
Metadaten in einer PE-Datei
Beim Kompilieren eines Programms für Common Language Runtime wird es in eine PE-Datei konvertiert, die aus drei Teilen besteht. In der folgenden Tabelle werden die einzelnen Teile beschrieben.
PE-Abschnitt | Inhalt des PE-Abschnitts |
---|---|
PE-Header |
Index der Hauptabschnitte der PE-Datei und Adresse des Einstiegspunktes. Common Language Runtime verwendet diese Informationen, um die Datei als PE-Datei zu identifizieren und festzulegen, wo die Ausführung beginnt, wenn das Programm in den Speicher geladen wird. |
MSIL-Anweisungen |
MSIL-Anweisungen (Microsoft Intermediate Language), aus denen der Code besteht. Viele MSIL-Anweisungen werden von Metadatentokens begleitet. |
Metadaten |
Metadatentabellen und Heaps. Dieser Abschnitt wird von Common Language Runtime verwendet, um Informationen über jeden Typ und jeden Member des Codes aufzuzeichnen. Dieser Abschnitt enthält auch benutzerdefinierte Attribute und Sicherheitsinformationen. |