День сто шестьдесят восьмой. #ВопросыНаСобеседовании
Самые часто задаваемые вопросы на собеседовании по .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. Метаданные
Блок двоичных данных, состоящий из нескольких таблиц: определений, ссылок и манифеста.
Таблица определений:
-
-
-
-
-
-
-
Таблица ссылок:
-
-
-
-
Таблица манифеста:
-
-
-
-
4. IL-код
Скомпилированный IL-код модуля.
Источник: Джеффри Рихтер “CLR via C#”. 3-е изд. – СПб.: Питер, 2012. Глава 2.
Самые часто задаваемые вопросы на собеседовании по .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.