Эта статья требует дополнительных ссылок для проверки . ( июль 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)]
[Пользовательский] [Пользовательский (1)] [Пользовательский (1, Комментарий = "yes")]
Пользовательские атрибуты широко используются CLI. Windows Communication Framework использует атрибуты для определения контрактов служб, ASP.NET использует их для предоставления методов как веб-служб , LINQ to SQL использует их для определения сопоставления классов с базовой реляционной схемой , Visual Studio использует их для группировки свойств объекта. , разработчик класса указывает категорию для класса объекта, применяя[Category]
настраиваемый атрибут. Настраиваемые атрибуты интерпретируются кодом приложения, а не средой CLR. Когда компилятор видит настраиваемый атрибут, он генерирует настраиваемые метаданные, которые не распознаются CLR. Разработчик должен предоставить код для чтения метаданных и действий в соответствии с ними. Например, атрибут, показанный в примере, может обрабатываться кодом:
класс CustomAttribute : атрибут { private int paramNumber = 0 ; закрытый строковый комментарий = "" ; публичный CustomAttribute () { } публичный CustomAttribute ( int num ) { paramNumber = num ; } общедоступный строковый комментарий { набор { комментарий = значение ; } } }
Имя класса сопоставляется с именем атрибута. Visual C # компилятор автоматически добавляет строку « Attribute
» в конце любого имени атрибута. Следовательно, каждое имя класса атрибута должно заканчиваться этой строкой, но допустимо определять атрибут без Attribute
-суффикса. При добавлении атрибута к элементу компилятор будет искать как буквальное имя, так и имя, Attribute
добавленное в конец, i. е. если бы вы написали, [Custom]
компилятор будет искать как Custom
и CustomAttribute
. Если оба существуют, компилятор не работает. Атрибут может иметь префикс " @
", если вы не хотите рисковать двусмысленностью, поэтому запись [@Custom]
не будет соответствоватьCustomAttribute
. Использование атрибута вызывает конструктор класса. Поддерживаются перегруженные конструкторы. Пары имя-значение сопоставляются со свойствами, имя обозначает имя свойства, а предоставленное значение устанавливается этим свойством.
Иногда возникает двусмысленность относительно того, к чему вы прикрепляете атрибут. Рассмотрим следующий код:
[Оранжевый] public int ExampleMethod ( строковый ввод ) { // сюда идет тело метода }
Что было отмечено оранжевым? Это 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 основана на форме на диске.
Отражение [ править ]
Отражение - это API, используемый для чтения метаданных CLI. API отражения обеспечивает логическое представление метаданных, а не буквальное представление, предоставляемое такими инструментами, как metainfo. Отражение в версии 1.1 платформы .NET можно использовать для проверки описаний классов и их членов, а также для вызова методов. Однако он не разрешает во время выполнения доступ к CIL для метода. Версия 2.0 структуры позволяет получить CIL для метода.
Другие инструменты метаданных [ править ]
Помимо System.Reflection
пространства имен, также доступны другие инструменты, которые можно использовать для обработки метаданных. Microsoft .NET Framework включает библиотеку для работы с метаданными среды CLR, которая реализована в машинном коде . Также можно использовать сторонние инструменты для извлечения и управления метаданными, включая PostSharp и Mono Cecil .
См. Также [ править ]
- Аннотация Java
Ссылки [ править ]
- ^ "Файлы метаданных Windows (WinMD)" . Приложения Windows UWP .