XML ドキュメント ファイル処理
コンパイラは、ドキュメントを生成するためにタグ付けされたコードのコンストラクトごとに、ID 文字列を生成します。 詳細については、「ドキュメント コメントとして推奨されるタグ」を参照してください。 ID 文字列によって、コンストラクトは一意に識別されます。 XML ファイルを処理するプログラムは、ID 文字列を使用して、対応する .NET Framework のメタデータ、またはドキュメントを適用するリフレクション項目を識別できます。
XML ファイルは、コードの階層表現ではなく、要素ごとに生成された ID を持つフラット リストです。
コンパイラは、次の規則に基づいて ID 文字列を生成します。
文字列に空白は配置されません。
ID 文字列の最初の部分は、単一の文字とそれに続くコロンで識別されるメンバーの種類を示します。 使用されるメンバー型は次のとおりです。
文字 説明 N 名前空間
ドキュメント コメントを名前空間に追加することはできません。名前空間への cref 参照は可能です。T 型: クラス、インターフェイス、構造体、列挙、デリゲート D Typedef F フィールド P プロパティ (インデクサーまたはその他のインデックス付きプロパティを含む) 月 メソッド (コンストラクター、演算子などの特殊なメソッドを含む) E イベント = エラー文字列
あとに続く文字列で、エラーの情報を示します。 MSVC コンパイラは、解決できないリンクのエラー情報を生成します。文字列の 2 番目の部分は、項目の完全修飾名で、名前空間のルートから始まります。 項目の名前、それを囲む型、名前空間はピリオドで区切られます。 項目の名前自体にピリオドが含まれる場合、それはハッシュ記号 ('#') に置き換えられます。 項目の名前には、ハッシュ記号がないことが前提です。 たとえば、
String
コンストラクターの完全修飾名はSystem.String.#ctor
になります。プロパティおよびメソッドについては、メソッドに引数がある場合は、引数のリストをかっこで囲み、メソッドに続けて指定します。 引数がない場合は、かっこはありません。 引数はコンマで区切られます。 各引数は、.NET Framework シグネチャでエンコードされるのと同じようにエンコードされます。
基本データ型。 通常の型 (
ELEMENT_TYPE_CLASS
またはELEMENT_TYPE_VALUETYPE
) は、型の完全修飾名として表されます。組み込み型 (たとえば、
ELEMENT_TYPE_I4
、ELEMENT_TYPE_OBJECT
、ELEMENT_TYPE_STRING
、ELEMENT_TYPE_TYPEDBYREF
、ELEMENT_TYPE_VOID
) は、System.Int32
やSystem.TypedReference
のように、対応する完全な型の完全修飾名として表されます。ELEMENT_TYPE_PTR
は、修飾される型に続けて '*
' と表されます。ELEMENT_TYPE_BYREF
は、修飾される型に続けて '@
' と表されます。ELEMENT_TYPE_PINNED
は、修飾される型に続けて '^
' と表されます。 この要素は MSVC コンパイラでは生成されません。ELEMENT_TYPE_CMOD_REQ
は、修飾される型に続けて '|
' と修飾子クラスの完全修飾名で表されます。 この要素は MSVC コンパイラでは生成されません。ELEMENT_TYPE_CMOD_OPT
は、修飾される型に続けて '!
' と修飾子クラスの完全修飾名で表されます。ELEMENT_TYPE_SZARRAY
は、配列の要素型に続けて "[]
" と表されます。ELEMENT_TYPE_GENERICARRAY
は、配列の要素型に続けて "[?]
" と表されます。 この要素は MSVC コンパイラでは生成されません。ELEMENT_TYPE_ARRAY
は、[
lower bound:
size,
lower bound:
size]
の形式で表されます。ここで、コンマの個数はランク -1 個であり、各次元の下限とサイズは明らかな場合は、10 進数で表されます。 下限またはサイズの指定がない場合は省略されます。 特定の次元で下限およびサイズが省略されている場合は、':
' も省略されます。 たとえば、下限が 1 でサイズの指定がない 2 次元配列は[1:,1:]
と表されます。ELEMENT_TYPE_FNPTR
は、"=FUNC:type
(signature)" と表されます。ここで、type
は戻り値の型であり、signature はメソッドの引数です。 引数がない場合、かっこは省略されます。 この要素は MSVC コンパイラでは生成されません。
次に示すシグネチャ コンポーネントは、オーバーロードされるメソッドの区別には使用されることがないため、表されません。
呼び出し規約
返り値の種類
ELEMENT_TYPE_SENTINEL
変換演算子の場合のみ、上記のエンコードと同様に、メソッドの戻り値が '
~
' としてエンコードされ、それに続けて戻り値の型が表されます。ジェネリック型では、型の名前の後に、バックチック、ジェネリック型パラメーターの数を示す数値が順に続きます。 たとえば、 にします。
<member name="T:MyClass`2">
この例は、
public class MyClass<T, U>
として定義されている型を示しています。パラメーターとしてジェネリック型を受け取るメソッドでは、ジェネリック型パラメーターは、バックチック付きの数値 (`0、`1 など) として指定されます。 各数値は、型のジェネリック パラメーターに対する、0 から始まる配列位置を表しています。
例
次の例は、クラスおよびそのメンバーの ID 文字列を生成する方法を示します。
// xml_id_strings.cpp
// compile with: /clr /doc /LD
///
namespace N {
// "N:N"
/// <see cref="System" />
// <see cref="N:System"/>
ref class X {
// "T:N.X"
protected:
///
!X(){}
// "M:N.X.Finalize", destructor's representation in metadata
public:
///
X() {}
// "M:N.X.#ctor"
///
static X() {}
// "M:N.X.#cctor"
///
X(int i) {}
// "M:N.X.#ctor(System.Int32)"
///
~X() {}
// "M:N.X.Dispose", Dispose function representation in metadata
///
System::String^ q;
// "F:N.X.q"
///
double PI;
// "F:N.X.PI"
///
int f() { return 1; }
// "M:N.X.f"
///
int bb(System::String ^ s, int % y, void * z) { return 1; }
// "M:N.X.bb(System.String,System.Int32@,System.Void*)"
///
int gg(array<short> ^ array1, array< int, 2 >^ IntArray) { return 0; }
// "M:N.X.gg(System.Int16[], System.Int32[0:,0:])"
///
static X^ operator+(X^ x, X^ xx) { return x; }
// "M:N.X.op_Addition(N.X,N.X)"
///
property int prop;
// "M:N.X.prop"
///
property int prop2 {
// "P:N.X.prop2"
///
int get() { return 0; }
// M:N.X.get_prop2
///
void set(int i) {}
// M:N.X.set_prop2(System.Int32)
}
///
delegate void D(int i);
// "T:N.X.D"
///
event D ^ d;
// "E:N.X.d"
///
ref class Nested {};
// "T:N.X.Nested"
///
static explicit operator System::Int32 (X x) { return 1; }
// "M:N.X.op_Explicit(N.X!System.Runtime.CompilerServices.IsByValue)~System.Int32"
};
}