Общие сведения о метаданных
Метаданные используются для описания типов среды выполнения (классов, интерфейсов и типов значений), полей и методов, а также внутренней реализации и сведений о структуре, используемой средой 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 метаданных. |
|
Описание неуправляемых интерфейсов, предоставляющих доступ к метаданных, представленным типами, методами, полями и прочимы элементами платформы .NET Framework. |
|
Описание неуправляемых глобальных статических функций, используемых интерфейсом API метаданных. |
|
Описание неуправляемых перечислений, используемых интерфейсом API метаданных. |
|
Описание неуправляемых структур, используемых интерфейсом API метаданных. |
|
Описание неуправляемых объединений, используемых интерфейсом API метаданных. |
К началу