Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Метаданные в 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

Ссылки [ править ]

  1. ^ "Файлы метаданных Windows (WinMD)" . Приложения Windows UWP .