Обработка XML-файлов
Компилятор создает строку идентификатора для каждой конструкции в коде, отмеченной для создания документацииДополнительные сведения см. в разделе Рекомендуемые теги документирующие комментарии.Строка идентификатора однозначно определяет конструкцию.Программы, процесс XML-файл может использовать идентификатор строки для определения соответствующей метаданных платформы .NET Framework или элемент отражения, к которым применяется документации.
Xml-файл нет иерархического представления кода, его плоский список с созданным идентификатор для каждого элемента.
Компилятор следует приведенным ниже правилам при формировании строк идентификаторов:
Пробел не помещается в строку.
Первая часть строки идентификатора определяет тип идентифицированного члена в виде одного символа с последующим двоеточием.Используются следующие типы элементов.
Знак
Описание
N
namespace
Нельзя добавлять комментарии в пространство имен, документации cref ссылки на пространство имен возможна.
T
тип: класс, интерфейс, структура, перечисление, делегат
D
typedef
F
поле
P
свойство (включая индексаторы или другие индексированные свойства)
M
метод (включая такие специальные методы как конструкторы, операторы и так далее)
E
event
!
Строка ошибки
Остальная часть строки содержит сведения об ошибке.Компилятор Visual C++ создает C - сведения об ошибке для связей, которые нельзя разрешить.
Вторая часть строки – это полное имя элемента, начиная с корневого пространства имен.Имя элемента, его внешний тип или типы, а пространство имен разделяются по точки.Если имя элемента содержит точки, они заменяются решетками (#).Он предполагать, что несуществующий элемент имеет хэш- подпись непосредственно в своем имени.Например, полное имя конструктора 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 представлен символом “^” после измененного типа.Компилятор Visual C++ C никогда не создает это.
ELEMENT_TYPE_CMOD_REQ представлен символом “|” и полным именем класса модификатора после измененного типа.Компилятор Visual C++ C никогда не создает это.
ELEMENT_TYPE_CMOD_OPT представляется символом "!" и полным именем класса модификатора после измененного типа.
ELEMENT_TYPE_SZARRAY представлен символом “[]” после типа элемента массива.
ELEMENT_TYPE_GENERICARRAY представлен символом “[?]” после типа элемента массива.Компилятор Visual C++ C никогда не создает это.
ELEMENT_TYPE_ARRAY представлен [нижняя граница:size,нижняя граница:size], где число запятых это ранг - 1, а нижние границы и размер каждой размерности (если они известны) представлены десятичными числами.Если нижняя граница или размер не указаны, они просто опускаются.Если нижняя граница и размер для определенной размерности опущены, “:” также опускается.Например, двухмерный массив с 1 в качестве нижних границ и незаданными размерами – [1:,1:].
ELEMENT_TYPE_FNPTR представлен "=FUNC:type(сигнатура)", где type – возвращаемый тип, а сигнатура – аргументы метода.Если аргументы отсутствуют, скобки опускаются.Компилятор Visual C++ C никогда не создает это.
Следующие компоненты сигнатуры не представляются, так как они никогда не используются для разграничения перегруженных методов:
соглашение при вызове
возвращаемый тип
ELEMENT_TYPE_SENTINEL
Для операторов преобразования только кодировано возвращаемое значение метода как "|" следовать возвращаемым типом, как ранее кодировкой.
Для универсальных типов после имени типа будет следовать символ “`”, а затем число, указывающее количество параметров универсальных типов.Например:
<member name="T:MyClass`2">
Для типа определенного как public class MyClass<T, U>.
Для методов, принимающих в качестве параметров универсальные типы, параметры универсальных типов указываются в виде чисел, которым предшествуют символы “`” (например, `0,`1).Каждое число, представляющее нулевую нотацию массива для универсальных параметров типа.
Пример
В следующих примерах показано, как бы создавались идентификатор класса и его элементов.
// 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"
};
}