Введение
Метаданные общей языковой инфраструктуры (CLI) – это определенные структуры данных, встроенные в код общего промежуточного языка (CIL), которые описывают высокоуровневую структуру кода. Метаданные описывают все классы и члены классов, определенные в сборке, а также классы и члены классов, которые текущая сборка вызывает из другой сборки. Метаданные метода содержат полное описание метода, включая класс (и сборку, содержащую этот класс), тип возвращаемого значения и все параметры метода. Компилятор языка CLI генерирует метаданные и сохраняет их в сборке, содержащей CIL. Во время выполнения CIL среда выполнения проверяет, чтобы метаданные вызываемого метода соответствовали метаданным, хранящимся в вызывающем методе. Это гарантирует, что метод может быть вызван только с точным количеством и типами параметров. Платформа приложений Windows Runtime, представленная в Windows 8 и Windows Phone 8, использует формат метаданных CLI для описания интерфейсов компонентов кода, написанного на любом из поддерживаемых языков программирования. Отличие в использовании в Common Language Runtime заключается в том, что сборка обычно не содержит инструкций CIL.
Metadata, in the Common Language Infrastructure (CLI), refers to certain data structures embedded within the Common Intermediate Language (CIL) code that describes the high level structure of the code. Metadata describes all classes and class members that are defined in the assembly, and the classes and class members that the current assembly will call from another assembly. The metadata for a method contains the complete description of the method, including the class (and the assembly that contains the class), the return type and all of the method parameters. A CLI language compiler will generate the metadata and store this in the assembly containing the CIL. When the run time executes CIL it will check to make sure that the metadata of the called method is the same as the metadata that is stored in the calling method. This ensures that a method can only be called with exactly the right number of parameters and exactly the right parameter types. The Windows Runtime application platform, present in Windows 8 and Windows Phone 8, makes use of the CLI metadata format to describe component interfaces for code written in any of the supported programming languages. A difference in use within the Common Language Runtime is that an assembly typically does not contain any CIL instructions.
Хранение метаданных
Сборки содержат таблицы метаданных. Эти таблицы описаны в спецификации 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.