メタデータとは、共通言語基盤において、共通中間言語 (CIL) コードについての情報を記録したコードのことである。.NET Framework言語のコンパイラはCILを含むアセンブリにメタデータを保存する。メタデータには、そのアセンブリに含まれる全てのクラスやクラスメンバ、さらにそのアセンブリから呼び出される他のアセンブリのクラスやクラスメンバの情報が記録される。メソッドのメタデータにはそのメソッドに関する全ての情報が記録される(クラス、戻り値の型、パラメータなど)。共通言語ランタイム(CLR)がCILを実行する際、呼び出し元のメタデータが呼び出し先に記録されたメタデータと等しいことがチェックされる。これにより、パラメータや戻り値の型が完全に一致するメソッドが呼び出される。
開発者はコードに属性という形でメタデータを付加することができる。属性にはカスタム属性と擬似カスタム属性の二種類があり、それらは同じ文法で記述される。コードに属性を記述するとコンパイラはメタデータを生成する。擬似カスタム属性とはCLRが認識できるような属性である。例えば[Serializable]
(クラスのインスタンスがシリアライズ可能であることを示す属性)などがある。C#では次のように記述する。
[Serializable] public class MyClass { ... }
(擬似でない)カスタム属性が指定されると、コンパイラはCLRによって認識されないカスタムメタデータを生成する。開発者は、そのメタデータを読み取って処理をするコードを記述する必要がある。例えば、Visual Studioのプロパティウインドウではオブジェクトのプロパティがカテゴリで分類されている。これは、[Category]
カスタム属性を指定することによって行われている。この例はCLRではなくアプリケーション(プロパティウインドウ)が属性を解釈している。
リフレクションはメタデータを読み取るためのAPIである。リフレクションによってクラスやクラスメンバなどの情報を取得したり、メソッドを実行したりすることができる。.NET Framework 2.0以降では、メソッドのCILコードをも取得できる。