メタデータの概要

メタデータは、ランタイム型 (クラス、インターフェイス、および値の型)、フィールド、およびメソッドと、共通言語ランタイム (CLR: Common Language Runtime) によって使用される内部実装およびレイアウト情報を記述するために使用されます。 ランタイムは、メタデータを使用して、Microsoft Intermediate Language (MSIL) の JIT コンパイル、クラスの読み込み、コードの実行、および古い COM またはネイティブ環境との相互運用を行います。 メタデータはすべての CLR コンポーネントに含まれ、ランタイム、ツール、およびサービスで使用できます。

この概要は、次のセクションで構成されています。

  • メタデータ API

  • リフレクション サービスとの比較

  • スコープ

  • エラー チェック

  • 関連トピック

メタデータ API

メタデータのすべての操作は、メタデータ API を通じて実行されます。メタデータ API は、基になるデータ構造からクライアント (ツールおよびサービス) を分離します。 メタデータ API は、ランタイム バイナリ表現、古い COM タイプ ライブラリ、およびその他の形式をメモリとの間で透過的に転送できるようにするプラグ可能な永続形式を提供します。

メタデータ API には、メタデータを出力 (つまり生成) およびインポートするインターフェイスが含まれます。 クライアントは、次の方法でメタデータを出力またはインポートできます。

  • コンパイラおよびツールは、emit API を呼び出すことでメタデータを出力します。 メタデータは、コンパイルおよびリンク プロセス中に出力されます。 RAD ツールは、コンポーネントまたはアプリケーションのビルドの一部としてメタデータを出力します。 API メンバーは、インメモリ データ構造の書き込みおよび読み込みを行います。 これらのインメモリ構造は保存時に圧縮され、ターゲット コンパイル単位 (.obj ファイル)、実行可能 (.exe) ファイル、またはスタンドアロン メタデータ バイナリ ファイルにバイナリ形式で永続化されます。 複数のコンパイル単位をリンクして EXE または DLL を形成する場合、emit API メンバーは、各コンパイル単位のメタデータ セクションを単一の統合されたメタデータ バイナリ ファイルにマージするメソッドを提供します。

  • ローダーとその他のランタイム ツールおよびサービスは、API メンバーを呼び出すことでメタデータをインポートし、読み込みやアクティベーションなどのタスクを完了できるように、コンポーネントに関する情報を取得します。

ページのトップへ

リフレクション サービスとの比較

メタデータ API を使用すると、ランタイムによってクラスを読み込まなくても、コンポーネントのメタデータにアクセスできます。 この API は、パフォーマンスの最大化とオーバーヘッドの最小化に特化してデザインされています。 メタデータ エンジンでは、データを使用できますが、メモリ内データ構造に直接アクセスできない場合は停止します。 これに対し、実行時にクラスが読み込まれると、ローダーは、ランタイムのリフレクション サービスを使用して参照できる独自のデータ構造にメタデータをインポートします。

リフレクション サービスは、メタデータ API よりも多くの作業を実行します たとえば、継承階層を自動的に走査して、継承されたメソッドとフィールドに関する情報を取得します。 メタデータ API は、特定のクラスの直接的なメンバー宣言のみを返し、追加の呼び出しにより階層の走査および継承されたメソッドの列挙を実行するように API クライアントに要求します。 リフレクション サービスのアプローチでは、メタデータの概要が公開され、メタデータ API のアプローチでは、データ構造の走査が API クライアント側で完全に制御されます。

ページのトップへ

スコープ

メタデータを含むメモリの個別の領域をいつでも使用できます。 たとえば、ディスク上の既存のモジュールからすべてのメタデータを割り当てる 1 つの領域を使用できます。 同時に、後でモジュールとしてファイルに保存する個別の領域にメタデータを出力できます。

注意

ここでは、モジュールという用語は、メタデータを含むファイルを意味します。通常は、メタデータと Microsoft intermediate language (MSIL) コードの両方を含む .obj、.exe、.dll の各ファイルを意味しますが、メタデータだけを含むファイルを意味する場合もあります。

メモリ内のメタデータの各領域は、スコープと呼ばれます。 各スコープは 1 つのモジュールに対応します。 通常、モジュールはディスク上のファイルとして保存されますが、これは必須ではありません。 たとえば、多くの場合、スクリプト ツールでは、ファイルに保存されることはないメタデータが生成されます。

スコープという用語が使用されるのは、メタデータ トークンが定義される領域を表しているためです。 たとえば、値 N を持つメタデータ トークンは、特定のスコープ内のクラス定義に関する詳細を識別します。 ただし、その同じ値 N を持つメタデータ トークンが、別のスコープの完全に異なる詳細セットに対応している場合があります。

メモリ内にメタデータ スコープを構築するには、IMetaDataDispenser インターフェイスの CComPtrBase::CoCreateInstance メソッドを呼び出します。 このメソッドは、新しいスコープを作成するか、ファイルまたはメモリ位置から既存のメタデータ構造セットを開きます。 IMetaDataDispenser::DefineScope または IMetaDataDispenser::OpenScope メソッドを呼び出すたびに、呼び出し元は受け取る API を指定します。

  • IMetaDataEmit インターフェイスを使用すると、ツールはメタデータ スコープに書き込むことができます。

  • IMetaDataImport インターフェイスを使用すると、ツールはメタデータ スコープから読み込むことができます。

ページのトップへ

エラー チェック

メタデータ API は、最小限のセマンティック エラー チェックを実行します。 メタデータ API メソッドは、メタデータを生成するツールとサービスが、共通型システムで説明されているオブジェクト システム規則を適用し、開発中にメタデータ エンジンが追加チェックを行う必要はないと想定しています。

ページのトップへ

関連トピック

Title

Description

メタデータ トークン

抽象化を識別するために使用されるメタデータ トークンに関する情報を提供し、それらをメタデータ API で使用する方法について説明します。

メタデータ API のコーディング規則

メタデータ API で使用されるコーディング規則について説明します。

メタデータ インターフェイス

.NET Framework の型、メソッド、フィールドなどによって公開されるメタデータにアクセスできるようにするアンマネージ インターフェイスについて説明します。

メタデータ グローバル静的関数

メタデータ API が使用するアンマネージ グローバル静的関数について説明します。

メタデータ列挙体

メタデータ API が使用するアンマネージ列挙体について説明します。

メタデータ構造体

メタデータ API が使用するアンマネージ構造体について説明します。

メタデータ共用体

メタデータ API が使用するアンマネージ共用体について説明します。

ページのトップへ