Share via


メタデータと PE ファイルの構造

メタデータと Microsoft Intermediate Language (MSIL) は、それぞれ、.NET Framework のポータブル実行可能 (PE) ファイルの別のセクションに格納されます。 ファイルのメタデータ部分には、一連のテーブルとヒープ データの構造が格納されています。 MSIL 部分には、PE ファイルのメタデータ部分を参照する MSIL とメタデータ トークンが格納されています。 コードの MSIL を表示する MSIL 逆アセンブラー (Ildasm.exe) のようなツールを使用すると、メタデータ トークンが表示される場合があります。

メタデータのテーブルおよびヒープ

各メタデータ テーブルには、プログラムの要素に関する情報が保持されています。 たとえば、1 つのメタデータ テーブルにはコード内のクラスが記述されており、別のテーブルにはフィールドが記述されています。 コードに 10 個のクラスが存在する場合、クラス テーブルには、各クラスごとに 1 行、つまり 10 行が存在します。 メタデータ テーブルは、他のテーブルおよびヒープを参照します。 たとえば、クラスのメタデータ テーブルは、メソッドのテーブルを参照します。

また、メタデータは、4 つのヒープ構造 (文字列、BLOB、ユーザー文字列、および GUID) に情報を格納します。 型やメンバーに名前を付けるために使用する文字列はすべて、文字列ヒープに格納されています。 たとえば、特定のメソッドの名前はメソッド テーブルに直接は格納されず、メソッド テーブルから文字列ヒープ内に格納されているメソッドの名前を参照します。

メタデータ トークン

各メタデータ テーブルのそれぞれの行は、メタデータ トークンによって、PE ファイルの MSIL 部分内で一意に識別されます。 メタデータ トークンは、概念上、ポインターに類似しており、特定のメタデータ テーブルを参照します。

メタデータ トークンは、4 バイトで構成される数値です。 最上位バイトは、特定のトークンの参照先であるメタデータ テーブル (メソッド、型など) を表します。 残り 3 バイトは、記述されているプログラミング要素と対応する、メタデータ テーブル内の行を指定します。 たとえば、C# 言語でメソッドを定義し、そのメソッドを PE ファイルとしてコンパイルすると、PE ファイルの MSIL 部分に次のようなメタデータ トークンが格納されます。

 0x06000004

最上位バイト (0x06) は、MethodDef トークンであることを示します。 下位 3 バイト (000004) は、MethodDef テーブル内の、このメソッドの定義を記述する情報に対応する 4 行目を参照するように、共通言語ランタイムに指示します。

PE ファイル内のメタデータ

プログラムを共通言語ランタイムとしてコンパイルすると、プログラムは 3 つの部分で構成される PE ファイルに変換されます。 各部分の内容を説明する表を次に示します。

PE セクション

PE セクションの内容

PE ヘッダー

PE ファイルの主要なセクションのインデックスとエントリ ポイントのアドレス。

ランタイムはこの情報に基づいてファイルを PE ファイルとして識別し、実行開始位置と、メモリにプログラムをいつ読み込むかを判断します。

MSIL の命令

コードを構成する Microsoft Intermediate Language (MSIL) の命令。 ほとんどの MSIL 命令には、メタデータ トークンが付いています。

メタデータ

メタデータ テーブルおよびヒープ。 ランタイムはこのセクションを使用してコード内のすべての型およびメンバーに関する情報を記録します。 また、このセクションには、カスタム属性やセキュリティ情報も格納されています。

参照

概念

メタデータと自己言及的なコンポーネント