Метаданные (CLI)

редактировать

Метаданные CLI, представление на диске
Расширение имени файла .exe, .dll, .winmd
Магическое число 0x424A5342
Разработано Microsoft, Ecma International
Стандарт ECMA-335, часть II

Метаданные в Common Language Infrastructure (CLI) относятся к определенным структурам данных, встроенным в код Common Intermediate Language (CIL), который описывает высокоуровневую структуру кода. Метаданные описывают все классы и члены классов, определенные в сборке, а также классы и члены классов, которые текущая сборка будет вызывать из другой сборки. Метаданные для метода содержат полное описание метода, включая класс (и сборку, содержащую класс), тип возвращаемого значения и все параметры метода.

Язык CLI компилятор будет генерировать метаданные и хранить это в сборке, содержащей CIL. Когда среда выполнения выполняет CIL, она проверяет, совпадают ли метаданные вызываемого метода с метаданными, которые хранятся в вызывающем методе. Это гарантирует, что метод может быть вызван только с точно правильным количеством параметров и с точно правильными типами параметров.

Платформа приложений среды выполнения Windows, представленная в Windows 8 и Windows Phone 8, использует формат метаданных CLI для описания интерфейсов компонентов для кода, написанного на любом из поддерживаемых языков программирования. Разница в использовании в Common Language Runtime заключается в том, что сборка обычно не содержит никаких инструкций CIL.

СОДЕРЖАНИЕ
  • 1 Атрибуты
  • 2 Хранилище метаданных
  • 3 Отражение
  • 4 Другие инструменты метаданных
  • 5 См. Также
  • 6 Ссылки
Атрибуты

Разработчики могут добавлять метаданные в свой код с помощью атрибутов. Существует два типа атрибутов: настраиваемые и псевдо настраиваемые атрибуты, и для разработчика они имеют одинаковый синтаксис. Атрибуты в коде - это сообщения компилятору для создания метаданных. В CIL такие метаданные, как модификаторы наследования, модификаторы области видимости и почти все, кроме кодов операций или потоков, также называются атрибутами.

Настраиваемый атрибут - это обычный класс, наследующий от Attribute класса. Настраиваемый атрибут можно использовать в любом методе, свойстве, классе или всей сборке с синтаксисом: как в: [AttributeName(optional parameter, optional name=value pairs)]

[Custom] [Custom(1)] [Custom(1, Comment="yes")]

Пользовательские атрибуты широко используются CLI. Windows Communication Framework использует атрибуты для определения контрактов служб, ASP.NET использует их для предоставления методов как веб-служб, LINQ to SQL использует их для определения сопоставления классов с базовой реляционной схемой, Visual Studio использует их для группировки свойств объекта., разработчик класса указывает категорию для класса объекта, применяя [Category] настраиваемый атрибут. Настраиваемые атрибуты интерпретируются кодом приложения, а не средой CLR. Когда компилятор видит настраиваемый атрибут, он генерирует настраиваемые метаданные, которые не распознаются CLR. Разработчик должен предоставить код для чтения метаданных и действий в соответствии с ними. Например, атрибут, показанный в примере, может обрабатываться кодом:

class CustomAttribute: Attribute { private int paramNumber = 0; private string comment = ""; public CustomAttribute() { } public CustomAttribute(int num) { paramNumber = num; } public String Comment { set { comment = value; } } }

Имя класса сопоставляется с именем атрибута. Visual C # компилятор автоматически добавляет строку « Attribute » в конце любого имени атрибута. Следовательно, каждое имя класса атрибута должно заканчиваться этой строкой, но допустимо определять атрибут без Attribute -суффикса. При добавлении атрибута к элементу компилятор будет искать как буквальное имя, так и имя, Attribute добавленное в конец, i. е. если бы вы написали, [Custom] компилятор будет искать как Custom и CustomAttribute. Если оба существуют, компилятор не работает. Атрибут может иметь префикс " @ ", если вы не хотите рисковать двусмысленностью, поэтому запись [@Custom] не будет соответствовать CustomAttribute. Использование атрибута вызывает конструктор класса. Поддерживаются перегруженные конструкторы. Пары «имя-значение» сопоставляются со свойствами, имя обозначает имя свойства, а предоставленное значение устанавливается этим свойством.

Иногда возникает двусмысленность относительно того, к чему вы прикрепляете атрибут. Рассмотрим следующий код:

[Orange] public int ExampleMethod(string input) { //method body goes here }

Что было отмечено оранжевым? Это ExampleMethod его возвращаемое значение или, возможно, вся сборка? В этом случае компилятор по умолчанию будет рассматривать атрибут как прикрепленный к методу. Если это не то, что было задумано, или если автор желает уточнить свой код, можно указать цель атрибута. Запись [return: Orange] пометит возвращаемое значение как оранжевый, [assembly: Orange] отметит всю сборку. Допустимые целями являются assembly, field, event, method, module, param, property, return и type.

Псевдо-настраиваемый атрибут используется так же, как и обычные настраиваемые атрибуты, но у них нет настраиваемого обработчика; скорее компилятор внутренне осведомлен об атрибутах и ​​по-разному обрабатывает код, помеченный такими атрибутами. Атрибуты, такие как Serializable и Obsolete, реализованы как псевдо-настраиваемые атрибуты. Псевдо-настраиваемые атрибуты никогда не должны использоваться ILAsm, поскольку он имеет адекватный синтаксис для описания метаданных.

Хранилище метаданных

Сборки содержат таблицы метаданных. Эти таблицы описаны в спецификации CIL. Таблицы метаданных будут иметь ноль или более записей, и позиция записи определяет ее индекс. Когда код CIL использует метаданные, он делает это с помощью токена метаданных. Это 32- битное значение, где верхние 8 битов определяют соответствующую таблицу метаданных, а оставшиеся 24 бита дают индекс метаданных в таблице. Framework SDK содержит образец, metainfo который будет перечислять таблицы метаданных в сборке, однако эта информация редко бывает полезной для разработчика. Метаданные в сборке можно просмотреть с помощью инструмента ILDASM, предоставляемого .NET Framework SDK.

В стандарте CIL метаданные определены в форме ILAsm (язык ассемблера), форме представления на диске для хранения и форме, которая встроена в сборки формата Portable Executable (PE,.exe или.dll). Форма PE основана на форме на диске.

Отражение
Основные статьи: Reflection в C # и Reflection (компьютерное программирование)

Отражение - это API, используемый для чтения метаданных CLI. API отражения обеспечивает логическое представление метаданных, а не буквальное представление, предоставляемое такими инструментами, как metainfo. Отражение в версии 1.1 платформы.NET можно использовать для проверки описаний классов и их членов, а также для вызова методов. Однако он не разрешает во время выполнения доступ к CIL для метода. Версия 2.0 структуры позволяет получить CIL для метода.

Другие инструменты метаданных

Помимо System.Reflection пространства имен, также доступны другие инструменты, которые можно использовать для обработки метаданных. Microsoft.NET Framework включает библиотеку для работы с метаданными среды CLR, которая реализована в машинном коде. Также можно использовать сторонние инструменты для извлечения и управления метаданными, включая PostSharp и Mono Cecil.

Смотрите также
Рекомендации
Последняя правка сделана 2024-01-02 08:24:16
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте