Метаданные и структура PE-файла
Обновлен: Ноябрь 2007
Метаданные хранятся в одном разделе переносимого исполняемого (PE) файла .NET Framework, а код на промежуточном языке MSIL хранится в другом его разделе. Раздел файла с метаданными содержит ряд табличных структур и структур данных кучи. Раздел MSIL содержит код MSIL и лексемы метаданных, ссылающиеся на раздел метаданных PE-файла. Возможно появление лексем метаданных при использовании таких средств, как дизассемблер MSIL (Ildasm.exe) для просмотра кода MSIL или отладчик среды выполнения (Cordbg.exe) для создания дампа памяти.
Таблицы и кучи метаданных
Каждая таблица метаданных содержит сведения об элементах программы. К примеру, в одной таблице метаданных описываются классы в коде, в другой — поля и так далее. Если в коде используется десять классов, таблица классов будет содержать десять строк, по одной для каждого класса. Таблицы метаданных ссылаются на другие таблицы и кучи. Например, таблица метаданных для классов ссылается на таблицу методов.
В метаданных сведения также хранятся в четырех структурах кучи — в куче строк, больших двоичных объектов, пользовательских строк и идентификаторов 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 сопровождаются лексемами метаданных. |
Метаданные |
Таблицы и кучи метаданных Среда выполнения использует этот раздел для записи сведений о каждом типе и члене в коде. Этот раздел также содержит пользовательские атрибуты и сведения о безопасности. |