День сто шестьдесят восьмой. #ВопросыНаСобеседовании

Самые часто задаваемые вопросы на собеседовании по .NET

8. Что такое переносимый исполняемый файл (Portable Executable)?

Переносимый исполняемый (PE) файл – это стандартный файл, который операционная система может загрузить и исполнить. В системе Windows два типа приложений: консольные (Console User Interface, CUI) и графические (Graphical User Interface, GUI). В .NET Framework каждая программа выполняется в операционной системе с помощью CLR.



Управляемый PE-файл состоит из следующих частей:

1. Заголовок PE32(+)

Хранит стандартную информацию, ожидаемую Windows.



2. Заголовок CLR

Cодержит старшую и младшую версии CLR, для которых скомпонован модуль, ряд флагов и маркер MethodDef, указывающий метод точки входа в модуль. Кроме того, заголовок содержит размер и смещение некоторых таблиц метаданных, расположенных в модуле, а также может содержать сигнатуру строгого имени сборки, если используется строгое имя.



3. Метаданные

Блок двоичных данных, состоящий из нескольких таблиц: определений, ссылок и манифеста.

Таблица определений:

- ModuleDef – имя модуля с расширением, идентификатор версии модуля.

- TypeDef – записи для каждого типа, определённого в модуле: имя, базовый тип, флаги доступа и указатели на записи MethodDef, PropertyDef и EventDef этого типа.

- MethodDef – список методов, определённых в модуле: флаги (private, static, virtual и т.п.), сигнатура и смещение в модуле, по которому находится IL-код модуля. А также ссылки на записи в ParamDef для параметров модуля.

- FieldDef – список полей: флаги и тип поля.

- ParamDef – список параметров: флаги (in, out, ref и т.п.), тип и имя.

- PropertyDef – список свойств: имя, флаги, тип и вспомогательное поле.

- EventDef – список событий: имя и флаги.

Таблица ссылок:

- AssemblyRef – записи для каждой сборки, на которую ссылается модуль: имя, версия, региональные стандарты, маркер открытого ключа, флаги и хэш.

- ModuleRef – список PE-модулей, реализующих типы, на которые ссылается текущий модуль: имя файла сборки, расширение.

- TypeRef – список типов, на который ссылается модуль: имя типа и ссылка на его местоположение.

- MemberRef - список членов (поля, метода, свойства или события), на которые ссылается модуль: имя члена, сигнатура и ссылка на TypeRef.

Таблица манифеста:

- AssemblyDef – содержит запись, если модуль идентифицирует сборку: имя сборки, версия, региональные стандарты, флаги, хэш и открытый ключ издателя (может быть null).

- FileDef – список PE-файлов или файлов ресурсов, входящих в состав сборки: имя, расширение, хэш, флаги.

- ManifestResourceDef – список ресурсов, включённых в сборку: имя, флаги, индекс таблицы FileDef, указывающий на файл или поток с ресурсом (ресурс может быть как отдельным файлом, например, изображением, так и храниться в виде потока в PE-файле).

- ExportedTypesDef – список открытых типов, экспортируемых всеми PE-модулями сборки: имя типа, индекс таблицы FileDef и индекс таблицы TypeDef.



4. IL-код

Скомпилированный IL-код модуля.



Источник: Джеффри Рихтер “CLR via C#”. 3-е изд. – СПб.: Питер, 2012. Глава 2.