Поделиться через


Общие сведения о метаданных

Метаданные используются для описания типов среды выполнения (классов, интерфейсов и типов значений), полей и методов, а также внутренней реализации и сведений о структуре, используемой средой CLR. Среда выполнения использует метаданные для JIT-компиляции кода на языке MSIL, загрузки классов, выполнения кода и взаимодействия с классической моделью COM или машинным кодом. Метаданные входят в состав всех компонентов среды CLR и доступны для среды выполнения, средств и служб.

Обзор включает следующие разделы.

  • API метаданных

  • Сравнение со службами отражения

  • Область

  • Проверка наличие ошибок

  • Связанные разделы

API метаданных

Все операции с метаданными выполняются через API метаданных, которые отделяют клиента (средства и службы) от базовых структур данных. API метаданных предоставляет подключаемый формат хранения, позволяющий двоичному представлению среды выполнения, библиотекам классических COM-типов и другим форматам прозрачным образом осуществлять передачу в память и из нее.

Интерфейс API метаданных включает в себя интерфейсы, которые выдают (иными словами, генерируют) и импортируют метаданные. Клиент может выдавать или импортировать метаданные следующими способами.

  • Компиляторы и средства выдают метаданные, вызывая API для "выдачи". Метаданные выдаются во время процесса компиляции и связывания. Средства RAD выдают метаданные в составе компонентов построения или приложений. Члены API выполняют чтение и запись в структурах внутренних данных памяти. Для экономии времени эти внутренние структуры памяти сжимаются и хранятся в двоичном формате в целевом блоке компиляции (файле с расширением .obj), исполняемом файле (файле с расширением .exe) или отдельном двоичном файле метаданных. Если несколько объединенных между собой блоков компиляции образуют EXE-файл или библиотеку DLL, члены интерфейса API для "выдачи" предоставляют метод для слияния разделов метаданных из каждого блока компиляции в один интегрированный двоичный файл метаданных.

  • Загрузчик и другие средства и службы среды выполнения импортируют метаданные путем вызова членов API для "импорта" с целью получения сведений о компонентах, которые позволяют выполнять такие задачи, как загрузка и активация.

К началу

Сравнение со службами отражения

API метаданных позволяют получить доступ к метаданным компонентов без необходимости загрузки класса средой выполнения. Интерфейс API предназначен специально для максимизации производительности и минимизации количества служебных данных. Ядро метаданных делает данные доступными, однако не может предоставить непосредственный доступ к внутренним структурам данных в памяти. Напротив, при загрузке класса во время выполнения загрузчик импортирует метаданные в собственные структуры данных, которые можно просмотреть с помощью служб отражения среды выполнения.

Службы отражения выполняют значительно больше операций, чем интерфейс API метаданных. Например, они автоматически выполняют обход иерархии наследования для получения сведений о методах и полях этого процесса. Интерфейс API метаданных возвращает только объявления непосредственных членов для заданного класса и требует выполнения дополнительных вызовов клиента API для обхода иерархии и перечисления унаследованных методов. В подходе служб отражения предоставляются общие сведения о метаданных на верхнем уровне, в то время как в подход API метаданных клиенту API полностью предоставляется управление обходом структур данных.

К началу

Область

В любой заданный момент времени может существовать несколько отдельных областей памяти, в которых содержатся метаданные. Например, может существовать одна область, сопоставляющую все метаданные из существующего модуля на диске. В то же время метаданные можно выдавать в отдельную область, которая позже будет сохранена в файле в виде модуля.

ПримечаниеПримечание

Здесь слово модуль означает файл, содержащий метаданные.Обычно таким файлом является OBJ- EXE- или DLL-файл, содержащий как метаданные, так и код на языке MSIL, однако это может быть и файл, содержащий исключительно метаданные.

Каждая отдельная часть метаданных в памяти называется областью. Каждая область соответствует одному модулю. Модули часто сохраняются на диске в виде файлов, однако это не является обязательным. Например, средства создания сценариев часть создают метаданные, которые никогда не сохраняются в файле.

Понятие "область" используется потому, что этот объект представляет собой зону, в которой определены маркеры метаданных. Например, маркер метаданных со значением N задает сведения об определении класса в данной области. Однако другой маркер метаданных с тем же значением N может соответствовать совершенно другому набору сведений для другой области.

Чтобы задать область метаданных в памяти, нужно вызвать метод CComPtrBase::CoCreateInstance интерфейса IMetaDataDispenser. Этот метод создает новую область или открывает существующий набор структур метаданных из файла или расположения в памяти. При каждом вызове метода IMetaDataDispenser::DefineScope или IMetaDataDispenser::OpenScope вызывающий объект указывает, интерфейс API, который необходимо получить.

  • Интерфейс IMetaDataEmit позволяет средствам записывать данные в область метаданных.

  • Интерфейс IMetaDataImport позволяет средствам считывать данные из области метаданных.

К началу

Проверка наличие ошибок

Интерфейс API метаданных выполняет минимальную семантическую проверку наличие ошибок. В методах API метаданных предполагается, что средства и службы, которые выдают метаданные, обеспечивают принудительное соблюдение правил объектной системы, описанных в системе общих типов CTS, и любые дополнительные проверки ядром метаданных во время разработку излишни.

К началу

Связанные разделы

Заголовок

Описание

Лексемы метаданных

Сведения о маркерах метаданных, которые используются для определения абстракций, и описание способа использования маркеров с API метаданных.

Соглашения о написании кода для интерфейса API метаданных

Описывает соглашения о написании кода, используемые для интерфейса API метаданных.

Интерфейсы метаданных

Описание неуправляемых интерфейсов, предоставляющих доступ к метаданных, представленным типами, методами, полями и прочимы элементами платформы .NET Framework.

Глобальные статические функции метаданных

Описание неуправляемых глобальных статических функций, используемых интерфейсом API метаданных.

Перечисления метаданных

Описание неуправляемых перечислений, используемых интерфейсом API метаданных.

Структуры метаданных

Описание неуправляемых структур, используемых интерфейсом API метаданных.

Объединения метаданных

Описание неуправляемых объединений, используемых интерфейсом API метаданных.

К началу