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


Метаданные и структура PE-файла

Метаданные хранятся в одном разделе переносимого исполняемого (PE) файла .NET Framework, а код на промежуточном языке MSIL хранится в другом его разделе. Раздел файла с метаданными содержит ряд табличных структур и структур данных кучи. Раздел MSIL содержит код MSIL и лексемы метаданных, ссылающиеся на раздел метаданных PE-файла. При использовании таких средств, как дизассемблер MSIL (Ildasm.exe), для просмотра MSIL-кода можно обнаружить токены метаданных.

Таблицы и кучи метаданных

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

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

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

Каждая строка любой таблицы метаданных уникально идентифицируется в разделе MSIL PE-файла с помощью лексемы метаданных. Лексемы метаданных по своей сути похожи на указатели, сохраненные в MSIL, которые ссылаются на определенную таблицу метаданных.

Лексема метаданных является четырехбайтным числом. Старший байт указывает на таблицу метаданных, к которой относится данная лексема (метод, тип и т. д.). Остальные три байта определяют строку в таблице метаданных, которая соответствует описываемому программному элементу. Если определить метод в языке C# и скомпилировать его в PE-файл, то в разделе MSIL PE-файла может появиться следующая лексема метаданных:

 0x06000004

Старший байт (0x06) указывает, что это лексема MethodDef. Три младших байта (000004) отсылают среду CLR к четвертой строке таблицы MethodDef для получения сведений с описанием определения метода.

Метаданные внутри PE-файла

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

Раздел PE-файла

Содержание раздела PE-файла

Заголовок PE

Индекс основных разделов PE-файла и адрес точки входа.

Среда выполнения использует эти сведения для определения файла как PE-файла и определения начала выполнения при загрузке программы в память.

Инструкции MSIL

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

Метаданные

Таблицы и кучи метаданных Среда выполнения использует этот раздел для записи сведений о каждом типе и члене в коде. Этот раздел также содержит пользовательские атрибуты и сведения о безопасности.

См. также

Основные понятия

Метаданные и компоненты с самоописанием