Przetwarzanie pliku .Xml
Kompilator generuje ciąg Identyfikatora dla każdego konstrukcji w kodzie, który jest oznakowany do generowania dokumentacji.Aby uzyskać więcej informacji, zobacz Zalecane znaczniki komentarzy dokumentacji.Ciąg Identyfikatora jednoznacznie identyfikuje konstruują.Programy, które przetwarzają pliku XML można użyć ciąg Identyfikatora do identyfikacji odpowiedniego.NET Framework metadanych lub odbicie elementu do którego ma zastosowanie dokumentacji.
Plik XML nie jest Hierarchiczna reprezentacja kodu, jest płaska lista z wygenerowanego ID dla każdego elementu.
Generując ciągi identyfikatorów, kompilator przestrzega następujących zasad:
Nie odstępu jest umieszczany w ciągu.
Pierwsza część ciąg Identyfikatora identyfikuje rodzaj członka zdefiniowanych, za pomocą pojedynczego znaku, po której następuje dwukropek.Używane są następujące typy Członkowskie:
Znak
Opis
N
obszar nazw
Nie można dodawać komentarze dokumentacji do obszaru nazw, cref odwołania do obszaru nazw są możliwe.
T
Typ: klasa interfejsu, struct, enum, pełnomocnik
D
Element TypeDef
F
pole
P
Właściwość (w tym indeksatory lub innych właściwości indeksowanych)
M
Metoda (w tym takie specjalne metody jako konstruktorów, operatorów i tak dalej)
E
Zdarzenie
!
ciąg błędu
Reszta ciąg zawiera informacje o błędzie.Kompilator Visual C++ generuje informacje o błędzie dla łącza, których nie można rozpoznać.
Druga część ciągu jest w pełni kwalifikowaną nazwę elementu, począwszy od głównego obszaru nazw.Nazwa towaru, jego otaczający typu lub typów i obszaru nazw są oddzielonych kropkami.Jeśli nazwa sam element ma okresy, zostaną zastąpieni przez znak hash (#).Zakłada się, że żaden element nie ma znaku hash bezpośrednio w swoim imieniu.Na przykład, w pełni kwalifikowanej nazwy String Konstruktor byłoby "System.String.#ctor".
Dla właściwości i metod wymaga argumentów do metody, ujęte w nawiasy listy argumentów następująco.Jeśli nie ma żadnych argumentów, nie nawiasów są obecne.Argumenty są oddzielone przecinkami.Kodowanie każdego argumentu następuje bezpośrednio, jak to jest kodowany w podpisie.NET Framework:
Typy podstawowe.Regularne typów (po elemencie ELEMENT_TYPE_CLASS lub ELEMENT_TYPE_VALUETYPE) są reprezentowane jako w pełni kwalifikowanej nazwy typu.
Typów wewnętrznych (na przykład, ELEMENT_TYPE_I4, ELEMENT_TYPE_OBJECT, ELEMENT_TYPE_STRING, ELEMENT_TYPE_TYPEDBYREF.i ELEMENT_TYPE_VOID) są reprezentowane jako pełną nazwę odpowiedniego rodzaju pełną, na przykład, System.Int32 lub System.TypedReference.
ELEMENT_TYPE_PTR jest reprezentowana jako ' *' po zmodyfikowany typ.
ELEMENT_TYPE_BYREF jest reprezentowana jako ' @' po zmodyfikowany typ.
ELEMENT_TYPE_PINNED jest reprezentowany jako "^" po zmodyfikowany typ.Kompilator Visual C++ nigdy nie generuje to.
ELEMENT_TYPE_CMOD_REQ jest reprezentowana jako ' |' i w pełni kwalifikowanej nazwy klasy modyfikator, w następstwie zmodyfikowany typ.Kompilator Visual C++ nigdy nie generuje to.
ELEMENT_TYPE_CMOD_OPT jest reprezentowany jako "!" i w pełni kwalifikowanej nazwy klasy modyfikator, w następstwie zmodyfikowany typ.
ELEMENT_TYPE_SZARRAY jest reprezentowana jako "[]", po typ elementu tablicy.
ELEMENT_TYPE_GENERICARRAY jest reprezentowany jako "[?]" po typ elementu tablicy.Kompilator Visual C++ nigdy nie generuje to.
ELEMENT_TYPE_ARRAY jest reprezentowana jako dolnej granicy:size,dolnej granicy:size gdzie liczba przecinków jest ranga - 1, i dolne granice i rozmiar każdego wymiaru, jeśli są znane, są reprezentowane w zapisie dziesiętnym.Jeżeli nie określono dolną granicą lub rozmiar, po prostu pominięto.Jeśli dolną granicą i rozmiar dla określonego wymiaru zostaną pominięte, ':' zostanie pominięty, jak również.Na przykład, jest dwuwymiarową tablicę z 1 jako dolną i rozmiary nieokreślonego [1:, 1:].
ELEMENT_TYPE_FNPTR jest reprezentowany jako "= FUNC:type(podpisu)", gdzie type jest zwracany typ i podpisu jest argumenty metoda.Jeśli nie ma żadnych argumentów, nawiasy zostaną pominięte.Kompilator Visual C++ nigdy nie generuje to.
Następujące składniki podpisu nie są reprezentowane, ponieważ nigdy nie są one używane do różnicujące przeciążonej metody:
Konwencja wywoływania
zwracany typ
ELEMENT ELEMENT_TYPE_SENTINEL
Dla tylko operatory konwersji, wartość zwracana przez metodę są kodowane jako "~" następuje zwracany typ, jak już zakodowane.
Do typów ogólnych Nazwa typu nastąpią tylnej osi, a następnie numer wskazujący liczbę parametrów typu rodzajowego.Na przykład:
<member name="T:MyClass`2">
Dla typu, który jest zdefiniowany jako public class MyClass<T, U>.
Dla metod biorąc typy rodzajowe jako parametry parametr typu rodzajowego są określone jako liczb poprzedzona znaczniki tylnej osi (na przykład "0, 1).Każdy numer odpowiadający notacji tablicę indeksowaną od zera dla typu rodzajowego parametrów.
Przykład
Następujące przykłady przedstawiają sposób identyfikator ciągi dla klasy i jej członków powinien zostać wygenerowany.
// 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"
};
}