Введение

Метаданные общей языковой инфраструктуры (CLI) – это определенные структуры данных, встроенные в код общего промежуточного языка (CIL), которые описывают высокоуровневую структуру кода. Метаданные описывают все классы и члены классов, определенные в сборке, а также классы и члены классов, которые текущая сборка вызывает из другой сборки. Метаданные метода содержат полное описание метода, включая класс (и сборку, содержащую этот класс), тип возвращаемого значения и все параметры метода. Компилятор языка CLI генерирует метаданные и сохраняет их в сборке, содержащей CIL. Во время выполнения CIL среда выполнения проверяет, чтобы метаданные вызываемого метода соответствовали метаданным, хранящимся в вызывающем методе. Это гарантирует, что метод может быть вызван только с точным количеством и типами параметров. Платформа приложений Windows Runtime, представленная в Windows 8 и Windows Phone 8, использует формат метаданных CLI для описания интерфейсов компонентов кода, написанного на любом из поддерживаемых языков программирования. Отличие в использовании в Common Language Runtime заключается в том, что сборка обычно не содержит инструкций CIL.

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

Сборки содержат таблицы метаданных. Эти таблицы описаны в спецификации CIL. Таблицы метаданных могут содержать ноль или более записей, и позиция записи определяет её индекс. Когда код CIL использует метаданные, он делает это посредством токена метаданных. Это 32-битное значение, где старшие 8 бит идентифицируют соответствующую таблицу метаданных, а оставшиеся 24 бита указывают индекс метаданных в этой таблице. Framework SDK содержит пример, который позволяет вывести список таблиц метаданных в сборке, однако эта информация редко бывает полезна разработчику. Метаданные в сборке можно просмотреть с помощью инструмента ILDASM, поставляемого с NET Framework SDK. В стандарте CIL метаданные определены в формате ILAsm (язык ассемблера), в формате представления на диске для хранения и в формате, встроенном в сборки Portable Executable (PE, exe или dll). Формат PE основан на формате представления на диске.

Отражение

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

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

Кроме пространства имен, существуют и другие инструменты для работы с метаданными. Microsoft .NET Framework включает библиотеку манипулирования метаданными CLR, реализованную на нативном коде. Для извлечения и манипулирования метаданными также можно использовать сторонние инструменты, такие как PostSharp и Mono Cecil.