Метаданные (CLI)
Эта статья нуждается в дополнительных цитатах для проверки . ( июль 2016 г. ) |
Расширение имени файла | .exe , .dll , .winmd |
---|---|
Магическое число | 0x424A5342 |
Разработано | Майкрософт , Экма Интернэшнл |
Стандартный | 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]
Атрибуты
[ редактировать ]Разработчики могут добавлять метаданные в свой код через атрибуты . Существует два типа атрибутов: пользовательские и псевдопользовательские атрибуты, и для разработчика они имеют одинаковый синтаксис . Атрибуты в коде — это сообщения компилятору о необходимости создания метаданных. В 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
добавлено в конец, т.е. е. если бы ты написал [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, входящего в состав пакета SDK для .NET Framework .
В стандарте CIL метаданные определяются в форме ILAsm (язык ассемблера), форме представления на диске для хранения и форме, встроенной в сборки формата переносимого исполняемого файла (PE, .exe или .dll). Форма PE основана на форме на диске.
Отражение
[ редактировать ]Отражение — это API, используемый для чтения метаданных CLI. API отражения обеспечивает логическое представление метаданных, а не буквальное представление, предоставляемое такими инструментами, как метаинформация. Отражение в версии 1.1 платформы .NET можно использовать для проверки описаний классов и их членов, а также для вызова методов. Однако он не обеспечивает доступ к CIL для метода во время выполнения. Версия 2.0 платформы позволяет получить CIL для метода.
Другие инструменты метаданных
[ редактировать ]Помимо System.Reflection
пространства имен, доступны и другие инструменты, которые можно использовать для обработки метаданных. Microsoft .NET Framework включает в себя библиотеку манипулирования метаданными CLR, реализованную в машинном коде . сторонние инструменты для получения метаданных и управления ими, включая PostSharp и Mono Cecil Также можно использовать .
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Файлы метаданных Windows (WinMD)» . Приложения UWP для Windows .