Файлы метаданных Windows (WinMD)
интерфейсы api среда выполнения Windows (WinRT) описаны в файлах метаданных, доступных для чтения компьютером, с расширением .winmd
(также известным как Windows метаданные). Эти файлы метаданных используются инструментами и языковыми проекциями для включения языковой проекции.
Windows содержит метаданные для всех предоставляемых системой api-интерфейсов WinRT. Windows предоставляет api-интерфейсы для упрощения языковых проекций при разрешении пространств имен и типов, которым требуются эти метаданные во время выполнения. Windows SDK предоставляет копию системных метаданных в одном файле для использования в проектах языка, которым требуются эти метаданные во время компиляции.
Сторонние стороны могут разрабатывать собственные API-интерфейсы WinRT, которые могут участвовать в проецировании на языке, например предоставляемых системой API. Сторонние API-интерфейсы WinRT должны предоставлять метаданные так же, как и системные API. Windows интерфейсы api для пространства имен и разрешения типов в метаданных сторонних поставщиков, например для системных метаданных.
Все открытые типы в файле WinMD должны быть типами WinRT и должны содержать флаг Тдвиндовсрунтиме (подробные сведения о флагах типа). WinMD-файлы могут содержать метаданные для типов, не являющихся типами WinRT. Все типы, не являющиеся типами WinRT в файле WinMD, не должны быть открытыми. Семантика для типов, не являющихся типами WinRT, определяется реализацией и выходит за рамки этого документа.
Все открытые члены интерфейса (методы, свойства и события) в типах WinRT должны быть членами интерфейса WinRT. Типы WinRT могут включать метаданные для членов интерфейса, не являющихся членами WinRT. Все члены интерфейса, не являющиеся членами WinRT, могут быть не общедоступными. Семантика для членов интерфейса, не являющихся членами WinRT, определяется реализацией и выходит за рамки этого документа.
Файлы WinMD используют тот же формат физического файла, что и сборки среды CLR, как определено в спецификации ECMA-335. Однако, хотя физический формат файла одинаков, правила для допустимых сочетаний данных отличаются для файлов WinMD и сборок среды CLR. В этом документе перечислены различия между WinMD-файлами и сборками среды CLR.
Предоставленные системой файлы WinMD являются чистыми метаданными. Сторонние файлы WinMD могут содержать код. В частности, управляемые файлы WinMD включают код на языке MSIL, так же как и традиционные сборки CLR.
Каждый файл WinMD содержит определения от нуля или более типов WinRT. Пустые файлы WinMD технически являются допустимыми.
Нет конкретных ограничений WinRT на Пекинд или архитектуре машин, перечисленных в WinMD.
строка версии WinMD должна содержать "среда выполнения Windows 1,2".
Имя файла WinMD (без расширения) должно совпадать со столбцом Name таблицы Assembly внутри файла WinMD. Например, файл "foo. Bar. winmd" должен содержать "Foo.Bar" в столбце Name таблицы Assembly. Так как в файловой системе регистр не учитывается, регистр имени файла может отличаться от значения столбца имя таблицы сборки.
Все типы WinRT в указанном файле WinMD должны находиться в пространстве имен, соответствующем имени WinMD-файла, и значения столбца имя таблицы сборки. Так как в файловой системе регистр не учитывается, регистр имени файла может отличаться от пространства имен всех типов WinRT в указанном файле WinMD. Пространство имен всех типов WinRT в заданном WinMD должно точно совпадать со значением столбца имени таблицы сборки (то есть с учетом регистра). Например, все типы в файле с "Foo.Bar" в столбце имени таблицы сборки должны находиться в пространстве имен "Foo.Bar". Типами могут быть либо прямые дочерние элементы этого пространства имен (например, foo. MyType), либо во вложенных пространствах имен этого пространства имен (например, foo. Bar. baz. MyType). Имя файла должно быть "foo. Bar. winmd", но оно может отличаться в случае, например "foo. Bar. winmd" и "FOO. Панели. WINMD также может быть разрешен в качестве имен файлов для этого файла метаданных.
Метаданные всех типов в системе распределяются по нескольким WinMD-файлам. Пакет AppX может содержать не менее одного файла. winmd, описывающего сторонние компоненты WinRT, включенные в пакет приложения.
Для всех файлов WinMD, предоставляемых системой или включенных в заданное приложение, все метаданные типа WinRT должны храниться в файле WinMD с самым длинным именем, соответствующим пространству имен типа. Все типы, являющиеся прямыми дочерними элементами данного пространства имен, должны находиться в одном файле. Например, если пакет AppX содержит файлы foo. winmd и foo. Bar. winmd, то тип foo. Bar. baz. MyType должен находиться в файле foo. Bar. winmd, так как это файл с самым длинным именем файла, соответствующим пространству имен для типа в пакете.
Файлы метаданных, предоставляемые системой, никогда не ссылаются на TypeDefs напрямую. Даже при ссылке на тип, определенный в том же файле метаданных, системные файлы метаданных всегда ссылаются на TypeRef, который, в свою очередь, ссылается на определение типа. Это делается для поддержки перенаправления типов CLR (например, проецирование IVector < t > как IList < t >).
Сторонние файлы метаданных могут использовать TypeDef напрямую или перенаправлять все ссылки на типы с помощью TypeRef аналогично тому, как это делают системные файлы метаданных.
Все типы в этом документе из пространства имен System из сборки mscorlib используются в качестве маркеров в WinRT. Эти типы используются для указания сведений о типах и никогда не должны быть разрешены. К ним относятся (но не ограничиваются) System. Object, System. GUID, System. ValueType, System. Enum, System. MulticastDelegate и System. Attribute. Обратите внимание, что эти имена были выбраны для обеспечения совместимости со средой CLR. Определение этих типов в среде CLR является частью своей системы типов и не имеет никаких действий с WinRT.
Обратите внимание, что многие из описанных здесь конструкций используют синтаксис C#. Это просто потому, что удобно представлять определенные конструкции метаданных Common Language Infrastructure (CLI) с помощью синтаксиса C#. Фактические конструкции представляют собой чистые конструкции метаданных интерфейса командной строки.
WinRT кодирует пространство имен и локальное имя типа в одной строке с разделителями по точкам. Например, тип, определенный в этом фрагменте кода, — это "Windows. Foundation. Исимплеинтерфаце ".
namespace Windows {
namespace Foundation {
interface ISimpleInterface {
HRESULT Method1(int paramOne);
};
};
};
Для оптимизации пространства таблица TypeDef в метаданных CLI предоставляет отдельные столбцы для имени типа и имени пространства имен. Однако на уровне API свойство TypeDef предоставляет только имя типа.
Все фундаментальные типы WinRT, за исключением GUID, имеют явные константные значения для использования в BLOB-объектах метаданных CLI и других ссылках на типы. Эти константные значения описаны в разделе 2 раздела 23.1.16 спецификации CLI.
Тип WinRT | Имя типа элемента CLI | Значение типа элемента CLI |
---|---|---|
Int16 | ELEMENT_TYPE_I2 | 0x06 |
Int32 | ELEMENT_TYPE_I4 | 0x08 |
Int64 | ELEMENT_TYPE_I8 | 0x0a |
UInt8 | ELEMENT_TYPE_U1 | 0x05 |
UInt16 | ELEMENT_TYPE_U2 | 0x07 |
UInt32 | ELEMENT_TYPE_U4 | 0x09 |
UInt64 | ELEMENT_TYPE_U8 | 0x0b |
Single | ELEMENT_TYPE_R4 | 0x0c |
Double | ELEMENT_TYPE_R8 | 0x0D |
Char16 | ELEMENT_TYPE_CHAR | 0x03 |
Логическое | ELEMENT_TYPE_BOOL | 0x02 |
Строка | ELEMENT_TYPE_STRING | 0x0E |
Так как для них не задано явное значение константы ELEMENT_TYPE_ *, идентификаторы GUID представляются в метаданных как TypeRef для типа System. GUID из сборки mscorlib.
Перечисления представляются в виде строки в таблице TypeDef (ECMA II. 22.37) со столбцами, заданными следующим образом.
- Метки. Установить общедоступный | Sealed | Тдвиндовсрунтиме (0x4101).
- Название Индекс в куче строк, содержащий имя типа.
- Пространство имен. Индекс в куче строк, который содержит пространство имен типа.
- Предоставляет. Задайте значение TypeRef, которое ссылается на класс System. Enum в сборке mscorlib.
- Списокполей. Индекс в таблице полей, помечающий первый из непрерывного выполнения полей, принадлежащих этому типу.
- Месодлист. Должен быть пустым.
Перечисление содержит одно поле экземпляра, которое указывает базовый целочисленный тип для перечисления, а также ноль или более статических полей; по одному для каждого значения перечисления, определенного типом перечисления.
Базовый целочисленный тип перечисления отображается как первая строка в таблице полей (ECMA II. 22.15), связанная с типом (т. е. в столбце Списокполей, который указан выше). Ниже приведены столбцы в таблице полей для типа Enum.
- Флаги: частный | SpecialName | RTSpecialName (0x601).
- Имя: индекс в куче строк, который содержит имя "value__".
- Сигнатура: индекс в куче больших двоичных объектов, содержащий большой двоичный объект Фиелдсиг (ECMA II. 23.2.4), для которого задан тип ELEMENT_TYPE_I4 или ELEMENT_TYPE_U4, так как значения перечисления WinRT должны быть со знаком или без знака 32 битовых целых чисел.
После определения значения перечисления поступает определение поля для каждого из значений в перечислении.
- Флаги: public | статический | Literal | hasDefault (0x8056).
- Имя: индекс в куче строк, который содержит имя перечислимого значения.
- Сигнатура: индекс в куче больших двоичных объектов, содержащий большой двоичный объект Фиелдсиг (ECMA II. 23.3.4) с типом, равным TypeDef типа перечисления.
Для каждого определения значения перечисления существует соответствующая строка в таблице констант (ECMA II. 22.9) для хранения целочисленного значения перечисления.
- Введите , Один байт для представления базового типа перечисления, ELEMENT_TYPE_I4 или ELEMENT_TYPE_U4, за которым следует нуль байтов в соответствии со спецификацией ECMA.
- Parent: индекс в таблице полей, содержащей связанную запись значения перечисления.
- Значение: индекс в таблице больших двоичных объектов, который содержит целочисленное значение для перечисляемого значения.
Кроме того, атрибут System. FlagsAttribute должен быть добавлен в строку TypeDef типа для любых перечислений с базовым типом UInt32. Атрибут FlagsAttribute не должен добавляться в строку TypeDef типа Enum для перечислений с базовым типом Int32.
Для всех перечислений, предоставленных системой, Версионаттрибуте необходимо добавить в строку TypeDef типа. При необходимости Версионаттрибуте может быть добавлен в любую строку статического поля. При наличии значение версии из Версионаттрибуте в любых строках полей перечисления должно быть больше или равно значению параметра Версионаттрибуте в строке типа Enum TypeDef.
Структуры реализуются как строка в таблице TypeDef (ECMA II. 22.37) со столбцами, заданными следующим образом.
- Флаги — открытые | Sealed | Последовательный | Тдвиндовсрунтиме (0x4109).
- Имя — индекс в куче строк, который содержит имя типа.
- Пространство имен — индекс в куче строк, который содержит пространство имен типа.
- Расширяет — задает TypeRef, ссылающуюся на класс System. ValueType в сборке mscorlib.
- Списокполей — индекс в таблице полей, помечающий первый из непрерывного выполнения полей, принадлежащих этому типу.
- Месодлист — должен быть пустым.
Структуры содержат одну или несколько записей таблицы полей.
- Flags: public.
- Имя: индекс в куче строк, который содержит имя поля.
- Signature: индекс в куче больших двоичных объектов, содержащий большой двоичный объект Фиелдсиг (ECMA II. 23.2.4) с типом, равным маркеру метаданных для типа поля.
- Поля структуры должны быть фундаментальными типами, перечислениями или другими структурами.
Для всех структур, предоставляемых системой, Версионаттрибуте необходимо добавить в строку TypeDef типа struct.
Делегаты реализуются как строка в таблице TypeDef (ECMA II. 22.37) со столбцами, заданными следующим образом.
- Флаги: задано значение Public | Sealed | Тдвиндовсрунтиме (0x4101).
- Имя — индекс в куче строк, который содержит имя типа.
- Пространство имен — индекс в куче строк, который содержит пространство имен типа.
- Extends: задает TypeRef, ссылающуюся на класс System. MulticastDelegate в сборке mscorlib.
- Списокполей: должен быть пустым.
- Месодлист: индекс в таблице MethodDef (ECMA II. 22.26), помечающий первый из непрерывного выполнения методов, принадлежащих данному типу.
Строки TypeDef делегатов должны иметь атрибут GuidAttribute.
Делегаты имеют ровно две записи таблицы MethodDef. Первый определяет конструктор. Этот конструктор является маркером совместимости, поэтому он использует конструкции, не относящиеся к WinRT, такие как native int, и параметры, не являющиеся in
out
ни, ни. У делегатов WinRT нет такого метода конструктора.
- RVA: 0 (это абстрактная конструкция).
- Имплфлагс: Runtime (0x03).
- Флаги: частный | хидебисиг | SpecialName | RTSpecialName (0x1881).
- Имя: индекс в таблице строк, содержащий имя ". ctor".
- Сигнатура: индекс в куче больших двоичных объектов, содержащий большой двоичный объект Месоддефсиг (ECMA II. 23.2.1) для метода с объектом и собственным типом int в параметрах и без возвращаемого значения.
- ПАРАМЛИСТ: индекс в таблице param (ECMA II. 22.33), содержащий первый элемент в выполнении строк параметров, связанных с этим методом. Каждая строка в таблице Param содержит следующие сведения.
- Параметр объекта
- Последовательность 1
- Name "Object"
- Флаги: нет (0x00)
- Собственный параметр int
- Последовательность 2
- Name "метод"
- Флаги: нет (0x00)
- Параметр объекта
Вторая запись MethodDef определяет метод Invoke.
- RVA: 0 (это абстрактная конструкция)
- Имплфлагс: Runtime (0x03)
- Флаги: public | Виртуальный | Хидебисиг | SpecialName (0x08C6)
- Имя: индекс в таблице строк, содержащий имя Invoke.
- Сигнатура: индекс в куче больших двоичных объектов, содержащий Месоддефсиг большой двоичный объект (ECMA II. 23.2.1), который содержит типы параметров и тип возвращаемого значения делегата. Если делегат является параметризованным, BLOB-объект Месоддефсиг должен ссылаться на каждый из параметров типа делегатов через закодированный ЖЕНЕРИЦИНСТ тип (в соответствии с ECMA II. 23.2.12). Сведения о подчиняются параметризованным делегатам.
- ПАРАМЛИСТ: индекс в таблице param (ECMA II. 22.33), содержащий первый элемент в выполнении строк параметров, связанных с этим методом. Каждая строка в таблице param будет содержать следующие сведения.
- Flags — in или out в соответствии с параметром.
- Sequence — порядок последовательности параметра. Для возвращаемого значения метода зарезервировано нулевое значение
- Имя — индекс в куче строк, содержащей имя параметра для всех предоставленных системой делегатов, Версионаттрибуте необходимо добавить в строку TypeDef делегата.
Параметризованные делегаты имеют следующие дополнительные требования.
- Имя параметризованного делегата добавляется с обратным импульсом и число, представляющее число параметров типа, которое имеет параметризованный делегат. Например, Windows. Тип Foundation. EventHandler < T > хранится в метаданных с именем Windows. Foundation. EventHandler ' 1.
- Параметризованные делегаты имеют одну строку в таблице GenericParam (ECMA II. 22.20) для каждого параметра типа со столбцами, заданными следующим образом.
- Number: индекс универсального параметра, пронумерованный слева направо, начиная с нуля.
- Флаги: нет.
- Owner: индекс в таблице TypeDef для строки, содержащей интерфейс.
- Name: индекс в куче строк, содержащий имя универсального параметра.
Таблица TypeSpec (ECMA II. 23.2.14) используется для определения экземпляров параметризованных делегатов. Эти TypeSpec затем можно использовать в сигнатурах методов аналогично Типерефс.
Интерфейсы реализуются как строка в таблице TypeDef (ECMA II. 22.37) со столбцами, заданными следующим образом.
- Флаги:
- интерфейс | общедоступная | abstract | Тдвиндовсрунтиме (0x40A1) или
- интерфейс | Нотпублик | abstract | Тдвиндовсрунтиме (0x40A0)
- Имя: индекс в таблице строк, содержащий имя интерфейса.
- Пространство имен — индекс в куче строк, который содержит пространство имен типа.
- Расширяет: NULL.
- Списокполей: должен быть пустым.
- Месодлист: индекс в таблице MethodDef, помечающий первый из непрерывного выполнения методов, принадлежащих этому типу. Особенности содержимого таблицы MethodDef подробно описаны в подразделах текущего раздела.
Строки TypeDef интерфейса должны иметь атрибут GuidAttribute, а также Версионаттрибуте.
Любой интерфейс WinRT с закрытой видимостью должен иметь один Ексклусиветоаттрибуте. Любой интерфейс WinRT с открытой видимостью не должен иметь Ексклусиветоаттрибуте. При наличии Ексклусиветоаттрибуте должен ссылаться на класс среды выполнения.
Необходимые интерфейсы для интерфейса представлены строками в таблице InterfaceImpl (ECMA II. 22.23) со столбцами, заданными следующим образом.
- Класс: индекс в таблице TypeDef для строки, содержащей интерфейс.
- Interface — индекс в таблице TypeDef, TypeRef или TypeSpec, указывающей требуемый интерфейс. Обратите внимание, что в системных файлах метаданных это никогда не будет определяться как TypeDef, даже если требуемый интерфейс определен в том же файле метаданных. Дополнительные сведения см. в разделе Перенаправление TypeDef.
Параметризованные интерфейсы являются следующими дополнительными требованиями.
Имя параметризованного интерфейса добавляется с обратным импульсом и число, представляющее число параметров типа, которое имеет параметризованный делегат. Например, Windows. Тип Foundation. Collections. IVector < T > хранится в метаданных с именем Windows. Foundation. Collections. IVector ' 1.
Параметризованные интерфейсы имеют одну строку в таблице GenericParam (ECMA II. 22.20) для каждого параметра типа со столбцами, заданными следующим образом.
- Number: индекс универсального параметра, пронумерованный слева направо, начиная с нуля.
- Флаги: нет.
- Owner: индекс в таблице TypeDef для строки, содержащей интерфейс.
- Name: индекс в куче строк, содержащий имя универсального параметра.
Таблица TypeSpec (ECMA II. 23.2.14) используется для определения экземпляров параметризованных интерфейсов. Эти TypeSpec можно использовать в сигнатурах методов и реализациях интерфейсов аналогично Типерефс.
При кодировании параметра массива для любого типа члена интерфейса параметр длины массива, непосредственно предшествующий параметру массива, опускается как в Месоддефсиг BLOB, так и в виде таблицы params.
Направление параметра массива непосредственно кодируется в метаданных. Направление параметра длины массива может быть выведено следующим образом.
- Если параметр массива является параметром in, параметр длины массива также должен быть параметром in.
- Если параметр массива является выходным и не выполняет маркер BYREF, то длина массива является параметром in.
- Если параметр массива является выходным и содержит маркер BYREF, то длина массива является выходным параметром.
Чтобы лучше моделировать ожидаемую проекцию методов, а также совместимость со средой CLR, требуемое возвращаемое значение HRESULT не кодируется в метаданных. Вместо этого параметр out, используемый в качестве возвращаемого значения, кодируется как возвращаемое значение в Месоддефсиг. Для методов, которые не объявляют параметр out для использования в качестве возвращаемого значения, Месоддефсиг должен объявить возвращаемый тип как void (в соответствии с ECMA II. 23.2.11).
Каждый метод в интерфейсе будет представлен в виде строки в таблице MethodDef. Каждая строка MethodDef будет содержать следующие сведения.
- RVA: 0x00
- Имплфлагс: 0x00
- Флаги: public | Виртуальный | Хидебисиг | Abstract | NewSlot | Экземпляр (0x5c6)
- Имя: индекс в таблице строк, содержащий имя метода.
- Сигнатура: индекс в куче больших двоичных объектов, содержащий Месоддефсиг большой двоичный объект (ECMA II. 23.2.1), который содержит типы параметров и тип возвращаемого значения метода. Если интерфейс является параметризованным, большой двоичный объект Месоддефсиг должен ссылаться на каждый из параметров типа интерфейса через закодированный ЖЕНЕРИЦИНСТ тип (в соответствии с ECMA II. 23.2.12). Сведения о подчиняются параметризованным интерфейсам.
- ПАРАМЛИСТ: индекс в таблице param (ECMA II. 22.33), содержащий первый элемент в выполнении строк параметров, связанных с этим методом.
Каждый параметр метода (плюс возвращаемое значение, если он указан) будет иметь соответствующую строку в таблице param (ECMA II. 22.33).
- Flags — None, in или out в соответствии с параметром.
- Возвращаемые значения всегда равны None
- Другие параметры всегда являются входными или выходными.
- Sequence — порядок последовательности параметра.
- Для возвращаемого значения метода зарезервировано нулевое значение
- Имя — индекс в куче строк, содержащей имя параметра.
Каждый метод может дополнительно иметь Оверлоадаттрибуте, который несет уникальное имя метода (в пределах области интерфейса). Каждый метод может иметь DefaultOverloadAttribute, указывающий, какой перегруженный метод той же арности (количество входных параметров) следует запланировать по нестрогим, динамически типизированным языкам.
Каждое свойство интерфейса определяется как строки в свойствах (ECMA II. 22.34), PropertyMap (ECMA II. 22.35), Месодсемантикс (ECMA II. 22.28) и MethodDef (ECMA II. 22.26).
Каждый интерфейс с одним или несколькими свойствами будет представлен в виде одной строки в таблице PropertyMap, содержащей следующие сведения.
- Parent: индекс в таблице TypeDef, содержащий интерфейс, содержащий свойства.
- PropertyList: индекс в таблице свойств, содержащий первый в выполнении строк, связанных с этим типом.
Каждое свойство будет представлено в виде одной строки в таблице свойств, содержащей следующие сведения.
- Флаги: нет.
- Имя: индекс в куче строк, содержащий имя свойства.
- Тип: индекс в куче больших двоичных объектов, который содержит большой двоичный объект Пропертисиг (ECMA II. 23.2.5), содержащий сведения о типе для свойства.
Каждое свойство будет представлено в виде одной или двух строк в таблице MethodDef. Свойства только для чтения представлены как один метод с префиксом "get_", тогда как свойства чтения и записи представлены двумя методами: один с "get_", а другой с префиксом "put_". Сигнатура для метода Get не принимает параметров и возвращает значение типа свойства. Сигнатура для метода Set принимает один параметр типа свойства и не возвращает ничего.
Строки MethodDef для свойства содержат следующее.
- RVA: 0
- Имплфлагс: нет
- Флаги: public | виртуальный | Хидебисиг | newSlot | abstract | SpecialName (0xDC6)
- Имя: индекс в таблице строк, содержащий "get_ < PropertyName > " или "put_ < PropertyName > " (в зависимости от ситуации).
- Сигнатура: индекс в куче больших двоичных объектов, содержащий Месоддефсиг большой двоичный объект (ECMA II. 23.2.1), который содержит типы параметров и тип возвращаемого значения метода, как описано выше.
- ПАРАМЛИСТ: индекс в таблице param (ECMA II. 22.33), содержащий первый элемент в выполнении строк параметров, связанных с этим методом. Значения в таблице param указаны в приведенных выше методах.
Каждая строка MethodDef для свойства будет иметь связанную строку в таблице Месодсемантикс, которая содержит следующие сведения.
- Семантика: Getter или Setter соответственно.
- Метод: индекс в таблице MethodDef, содержащей метод Getter или Setter.
- Ассоциация: индекс в таблице свойств, содержащей свойство.
Каждое событие в интерфейсе определяется как строки в событии (ECMA II. 22.13), Евентмап (ECMA II. 22.12), Месодсемантикс (ECMA II. 22.28) и MethodDef (ECMA II. 22.26).
Каждый интерфейс с одним или несколькими событиями будет представлен в виде одной строки в таблице Евентмап, содержащей следующие сведения.
- Parent: индекс в таблице TypeDef, содержащий интерфейс, содержащий свойства.
- Евентлист: индекс в таблице событий, содержащий первый в выполнении строк, связанных с этим типом.
Каждое событие будет представлено в виде одной строки в таблице событий, содержащей следующие сведения.
- Евентфлагс: нет.
- Имя: индекс в куче строк, содержащий имя свойства.
- EventType: объект TypeDefOrRef, который индексируется в соответствующей таблице, содержащей тип делегата события.
Каждое событие будет представлено в виде двух строк в таблице MethodDef: одна с префиксом "add_" для добавления прослушивателей событий, а другая с префиксом "remove_" для удаления прослушивателей событий. Метод Add принимает экземпляр делегата и возвращает Windows. Foundation. EventRegistrationToken, который представляет регистрацию событий. Метод Remove принимает EventRegistrationToken, возвращенный методом Add, для отмены регистрации события.
Строки MethodDef для события содержат следующее.
- RVA: 0
- Имплфлагс: нет
- Флаги: public | Final | виртуальный | хидебисиг | NewSlot | SpecialName (0x09e6)
- Имя: индекс в таблице строк, содержащий "add_ < PropertyName > " или "remove_ < PropertyName > ".
- Сигнатура: индекс в куче больших двоичных объектов, содержащий Месоддефсиг большой двоичный объект (ECMA II. 23.2.1), который содержит параметры и возвращаемые типы метода, как описано ниже.
- Add_ метод принимает один параметр типа делегата и возвращает Windows. Foundation. EventRegistrationToken.
- Remove_ метод принимает один Windows. Параметр Foundation. EventRegistrationToken и ничего не возвращает.
- ПАРАМЛИСТ: индекс в таблице param (ECMA II. 22.33), содержащий первый в выполнении строк параметров, связанных с методом. Значения в таблице param указаны в приведенных выше методах.
Обе строки MethodDef для события будут иметь связанную строку в таблице Месодсемантикс, содержащую следующие сведения.
- Семантика: надстройка или RemoveOn.
- Метод: индекс в таблице MethodDef, содержащей метод добавления или удаления прослушивателя.
- Ассоциация: индекс в таблице событий, содержащей событие.
Классы среды выполнения реализуются как строка в таблице TypeDef (ECMA II. 22.37) со столбцами, заданными следующим образом.
- Flags: все классы среды выполнения должны содержать флаги Public, AutoLayout, Class и Тдвиндовсрунтиме.
- Только статические классы содержат абстрактный флаг. Все остальные классы не имеют абстрактного флага.
- Классы, не допускающие композицию, имеют флаг Sealed. Допускающие композицию классы не имеют запечатанного флага.
- Имя: индекс в таблице строк, содержащий имя класса.
- Пространство имен — индекс в куче строк, который содержит пространство имен типа.
- Расширяет: индекс на TypeRef, ссылающийся либо на составной класс, либо на System. Object в mscorlib.
- Списокполей: должен быть пустым.
- Месодлист: индекс в таблице MethodDef, помечающий первый из непрерывного выполнения методов, принадлежащих этому типу. Подробные сведения о содержимом таблицы MethodDef приведены ниже.
Для всех предоставляемых системой классов Версионаттрибуте необходимо добавить в строку TypeDef класса.
Интерфейсы, реализованные классами среды выполнения, представлены строками в таблице InterfaceImpl (ECMA II. 22.23) со столбцами, заданными следующим образом.
- Класс: индекс в таблице TypeDef для строки, содержащей тип.
- Interface — индекс в таблице TypeDef, TypeRef или TypeSpec, указывающий реализованный интерфейс. Обратите внимание, что в системных файлах метаданных это никогда не будет определяться как TypeDef, даже если требуемый интерфейс определен в том же файле метаданных. Дополнительные сведения см. в разделе Перенаправление TypeDef.
Классы среды выполнения должны указывать Дефаултаттрибуте только для одной из строк InterfaceImpl.
Классы среды выполнения могут указывать Оверридаблеаттрибуте или Протектедаттрибуте для любой из их InterfaceImpl строк. Они не могут одновременно указывать Оверридаблеаттрибуте и Протектедаттрибуте в одной строке.
При необходимости Версионаттрибуте можно добавить в любую строку interfaceImpl класса. Значение версии из Версионаттрибуте в строках interfaceImpl любого класса должно быть больше или равно значению Версионаттрибуте в строке TypeDef класса.
Классы среды выполнения имеют ноль или более Статикаттрибуте настраиваемых атрибутов. Допускается указывать несколько настраиваемых атрибутов Статикаттрибуте, если каждый из них имеет разные заданные параметры. Все Статикаттрибуте будут отображаться в таблице CustomAttribute в виде строки со следующими сведениями.
- Parent: класс среды выполнения, с которым связан Статикаттрибуте.
- Тип: ссылка на Статикаттрибуте. ctor.
- Значение: большой двоичный объект настраиваемого атрибута, содержащий параметр статического интерфейса System. Type и параметр версии UInt32.
Классы среды выполнения имеют ноль или более Активатаблеаттрибуте настраиваемых атрибутов. Допускается указывать несколько настраиваемых атрибутов Активатаблеаттрибуте, если каждый из них имеет разные заданные параметры. Все Активатаблеаттрибутес будут отображаться в таблице CustomAttribute в виде строки со следующими сведениями.
- Parent: класс среды выполнения, с которым связан Активатаблеаттрибуте.
- Тип: ссылка на один из двух Активатаблеаттрибуте. ctor.
- Прямая активация:. ctor, принимающий только параметр версии UInt32.
- Активация с помощью фабрики:. ctor, принимающий параметр интерфейса фабрики System. Type и параметр версии UInt32.
- Значение: большой двоичный объект настраиваемого атрибута, содержащий параметр интерфейса фабрики System. Type (если он указан) и параметр версии UInt32.
Классы среды выполнения имеют ноль или более Компосаблеаттрибуте настраиваемых атрибутов. Допускается указывать несколько настраиваемых атрибутов Компосаблеаттрибуте, если каждый из них имеет разные заданные параметры. Все Компосаблеаттрибуте будут отображаться в таблице CustomAttribute в виде строки со следующими сведениями.
- Parent: класс среды выполнения, с которым связан Компосаблеаттрибуте.
- Тип: ссылка на Компосаблеаттрибуте. ctor.
- Значение. Пользовательский BLOB-объект атрибута, содержащий параметр интерфейса фабрики композиции System. Type, значение перечисления Компоситионтипе (Public или protected) и параметр версии UInt32.
Класс среды выполнения содержит строку в таблице MethodDef для каждого метода в каждом интерфейсе, связанном с классом. К ним относятся интерфейсы членов (обычные, защищенные и переопределяемые), статические интерфейсы, интерфейсы фабрики активации и интерфейсы фабрики с возможностью композиции. Кроме того, класс, который поддерживает прямую активацию, также будет содержать строку в таблице MethodDef, чтобы указать это.
Каждый метод из интерфейса члена (включая защищенные и переопределяемые интерфейсы) представлен строкой в таблице MethodDef класса. Таблица methodDef класса содержит точную копию данных MethodDef из исходного объявляющего интерфейса, включая строки таблицы параметров и пользовательские атрибуты со следующими исключениями.
- Классы среды выполнения могут указывать альтернативные имена для методов, определенных в интерфейсах членов.
- Методы в классах среды выполнения не получают абстрактный флаг.
- Методы в классах среды выполнения получают флаг выполнения MethodImpl.
- Методы из интерфейсов, не являющихся переопределяемыми, дополнительно получают окончательный флаг. Методы из переопределяемых интерфейсов не получают окончательный флаг.
Каждая строка в таблице MethodDef класса из интерфейса-члена подключается к методу интерфейса, который изначально определил метод через запись в таблице MethodImpl (ECMA II. 22.27) со значениями, как показано ниже.
- Класс — индекс в таблице TypeDef, который ссылается на класс, содержащий метод (Обратите внимание, что этот индекс не подлежит перенаправлению TypeDef).
- Месодбоди — индекс в таблице MethodDef, который ссылается на метод класса.
- MethodDeclaration — индекс в таблице MethodDef или MemberRef, который ссылается на изначально объявленный метод интерфейса.
Каждый метод из статического интерфейса представлен строкой в таблице MethodDef класса. Таблица methodDef класса содержит точную копию данных MethodDef из исходного объявляющего интерфейса, включая строки таблицы параметров и пользовательские атрибуты со следующими исключениями.
- Статические члены не получают виртуальные, абстрактные, NewSlot и флаги экземпляров.
- Статические члены получают статические и флаги класса.
- Статические методы в классах среды выполнения получают флаг выполнения MethodImpl.
Классы, поддерживающие Direct, Активация без параметров, имеют строку конструктора в таблице MethodDef класса со следующими значениями столбцов.
- RVA: 0x00
- Имплфлагс: Runtime
- Флаги: public | Хидебисиг | SpecialName | RTSpecialName | Вхождение
- Имя: индекс в таблице строк, содержащей ". ctor".
- Signature: индекс в куче больших двоичных объектов, содержащий большой двоичный объект Месоддефсиг (ECMA II. 23.2.1), который не содержит параметров и возвращает значение null.
- ПАРАМЛИСТ: должен быть пустым
Классы, поддерживающие фабричную активацию, имеют строку конструктора в таблице MethodDef класса для каждого метода в каждом реализованном интерфейсе фабрики со следующими значениями столбцов.
- RVA: 0x00
- Имплфлагс: Runtime
- Флаги: public | Хидебисиг | SpecialName | RTSpecialName | Вхождение
- Имя: индекс в таблице строк, содержащей. ctor.
- Сигнатура: индекс в куче больших двоичных объектов, содержащий Месоддефсиг большой двоичный объект (ECMA II. 23.2.1), содержащий входные параметры и возвращающий значение null.
- ПАРАМЛИСТ: указатель на таблицу params со строкой для каждого параметра, который копируется именно из таблицы params для первоначального объявления фабричного метода.
Классы, поддерживающие активацию фабрики композиции, имеют строку конструктора в таблице MethodDef класса для каждого метода в каждом реализованном интерфейсе фабрики со следующими значениями столбцов.
- RVA: 0x00
- Имплфлагс: Runtime
- Флаги: public | Хидебисиг | SpecialName | RTSpecialName | Вхождение
- Имя: индекс в таблице строк, содержащей. ctor.
- Сигнатура: индекс в куче больших двоичных объектов, содержащий Месоддефсиг большой двоичный объект (ECMA II. 23.2.1), содержащий пользовательские входные параметры и возвращающий значение null. Параметр управления IInspectable * [in] и не делегирование IInspectable * * [out] не отражаются в сигнатуре метода.
- ПАРАМЛИСТ: указатель на таблицу params со строкой для каждого параметра, за исключением параметра управления IInspectable * [in] и параметра, не являющегося делегированием IInspectable * * [out], копируется именно из таблицы params для первоначального объявления фабричного метода.
Настраиваемые атрибуты имеют ноль или более методов конструктора, каждый из которых содержит ноль или более параметров, в которых тип параметра ограничен базовыми типами, перечислениями и System. Type. Каждый конструктор в пользовательском атрибуте отображается в виде строки в MethodDef со следующими сведениями.
- RVA (с определенным относительным виртуальным адресом): NULL
- Имплфлагс: нет
- Флаги: public | Хидебисиг | спекалнаме | RTSpecialName (0x1886)
- Имя: индекс в таблице строк, содержащий имя ". ctor".
- Сигнатура: индекс в куче больших двоичных объектов, содержащий Месоддефсиг большой двоичный объект (ECMA II. 23.2.1), который содержит типы параметров и тип возвращаемого значения метода.
- ПАРАМЛИСТ: индекс в таблице param (ECMA II. 22.33), содержащий первый элемент в выполнении строк параметров, связанных с этим методом.
Пользовательские атрибуты в конструкциях метаданных хранятся в виде строк в таблице CustomAttribute (ECMA II. 22.10) со столбцами, заданными следующим образом.
- Parent: индекс в таблице метаданных, к которой присоединен настраиваемый атрибут.
- Тип: индексировать в таблицу MethodDef или MemberRef, содержащую ссылку на конструктор типа атрибута.
- Значение: индекс в куче больших двоичных объектов, который содержит параметры позиционированного и именованного атрибутов (ECMA II. 23.2). Обратите внимание, что, поскольку настраиваемые атрибуты WinRT не могут иметь свойства, BLOB-объект настраиваемого атрибута никогда не будет содержать именованные аргументы стиля свойств.