更新 : 2007 年 11 月
共通言語ランタイム (CLR: Common Language Runtime) メタデータ 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 メソッドは、メタデータを生成するツールとサービスが、共通型システムで説明されているオブジェクト システム規則を適用し、開発中にメタデータ エンジンが追加チェックを行う必要はないと想定しています。