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

以前は、ある 1 つの言語で記述されたソフトウェア コンポーネント (.exe または .dll) で、別の言語で記述されたコンポーネントを使用するのは簡単ではありませんでした。 COM により、この問題が解決するための手段が提供されるようになりました。 .NET Framework では、コンパイラからすべてのモジュールやアセンブリに追加の宣言情報を挿入できるようになり、コンポーネントの相互運用性が大幅に強化されています。 メタデータと呼ばれるこの情報により、コンポーネント間のシームレスな相互作用がサポートされます。

メタデータはプログラムを説明するバイナリ情報であり、共通言語ランタイムのポータブル実行可能 (PE) ファイルまたはメモリのいずれかに格納されます。 コードを PE ファイルとしてコンパイルすると、PE ファイルの特定の部分にメタデータが挿入され、コードは Microsoft Intermediate Language (MSIL) に変換されて PE ファイル内の別の部分に挿入されます。 モジュール内またはアセンブリ内で定義され、参照されているすべての型およびメンバーは、メタデータ内部に記述されます。 コードを実行すると、ランタイムはメタデータをメモリに読み込み、コードのクラス、メンバー、継承などの情報を検索するためにメタデータを参照します。

メタデータには、コードに定義されているすべての型およびメンバーが言語に中立的な形で記述されています。 メタデータには、次の情報が格納されいてます。

  • アセンブリに関する記述

    • ID (名前、バージョン、カルチャ、公開キー)

    • エクスポートされる型

    • そのアセンブリが依存している他のアセンブリ

    • 実行のために必要なセキュリティ アクセス許可

  • 型に関する説明

    • 名前、参照可能範囲、基本クラス、および実装されているインターフェイス

    • メンバー (メソッド、フィールド、プロパティ、イベント、入れ子になった型)

  • 属性。

    • 型やメンバーを修飾する追加の記述要素

メタデータの利点

メタデータは、プログラミング モデルを簡素化するうえで重要な役割を果たします。これにより、インターフェイス定義言語 (IDL: Interface Definition Language) ファイル、ヘッダー ファイル、およびその他のコンポーネント参照の外部メソッドは一切不要になります。 メタデータを使用すると、.NET Framework の各言語は、開発者やユーザーからは見えない、言語に依存しない形式で自動的に記述されるようになります。 また、属性を使用することにより、メタデータを拡張することもできます。 メタデータの主な利点は、次のとおりです。

  • 自己言及的なファイル

    共通言語ランタイム モジュールおよびアセンブリは、自己言及的なファイルです。 モジュールのメタデータには、他のモジュールと相互作用するのに必要なすべての情報が含まれています。 メタデータは自動的に COM の IDL の機能を提供するため、ユーザーは 1 つのファイルを定義と実装の両方に使用できます。 また、ランタイム モジュールやアセンブリをオペレーティング システムに登録する必要もありません。 これにより、ランタイムが使用する記述は常にコンパイル済みファイル内の実際のコードに反映されるため、アプリケーションの信頼性が高くなります。

  • 言語の相互運用性と簡単なコンポーネント ベースのデザイン

    メタデータは、他の言語で記述されている PE ファイルからクラスを継承するのに必要な、コンパイル済みコードについてのすべての情報を提供します。 明示的なマーシャリングや相互運用可能なカスタム コードの使用を考慮せずに、マネージ言語 (共通言語ランタイムに変換される言語) で記述された任意のクラスのインスタンスを作成できます。

  • 属性。

    .NET Framework を使用すると、コンパイル済みファイル内で "属性" と呼ばれる特定の種類のメタデータを宣言できます。 属性は、.NET Framework 全体で使用され、実行時のプログラムの動作を詳細に制御します。 また、ユーザー定義のカスタム属性によって、独自に作成したメタデータを .NET Framework のファイルに挿入できます。 詳細については、「属性を使用したメタデータの拡張」を参照してください。

関連トピック

タイトル

説明

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

PE ファイルの MSIL (Microsoft Intermediate Language) とは別にメタデータを格納する方法について説明します。

実行時のメタデータの使用

実行時にメタデータを使用するコード例を示します。

属性を使用したメタデータの拡張

属性の適用方法、カスタム属性の記述方法、および属性に格納されている情報の取得方法を説明します。