Не имеет никакого смысла добавлять другие типы расширений только для обслуживания .NET.
.NET исполняемые файлы представляют собой PE-файлы, и они предоставляют минимальный объем собственного кода для начальной загрузки правильной версии CLR, извлечения IL-файла в память и передачи в CLR.
Windows изначально знает, что делать с PE-файлами, и с помощью механизма косвенности, встроенного в EXE. Windows также не нужно знать о .NET.
С файлом .il
вам необходимо зарегистрировать расширение в Windows, а затем убедиться, что загружена правильная версия CLR - насколько я знаю, вы можете связать расширение только с одним исполняемым файлом.
Для поддержки нескольких версий CLR вам потребуется какой-то посредник, который затем проверяет ваш файл .il
, чтобы определить, какой CLR загружать .... и после этого все становится запутанным и хрупким.
Упаковка всего этого в PE решает эти проблемы аккуратно и элегантно.
Несмотря на то, что это более старая статья, принципы остаются неизменными в современных платформах .NET:
Углубленный взгляд на формат исполняемых файлов Win32, часть 2
В разделе «Заголовок .NET» объясняется, как это работает:
Исполняемые файлы, созданные для Microsoft
.NET среды являются первыми и
прежде всего PE файлы. Однако в большинстве
дел нормальный код и данные в .NET
файл минимален. Основная цель
исполняемого файла .NET, чтобы получить
.NET-специфичная информация, такая как
метаданные и промежуточный язык
(IL) в память. Кроме того, .NET
исполняемые ссылки на MSCOREE.DLL.
Эта DLL является отправной точкой для
.NET процесс. Когда исполняемый файл .NET
загружает, его точка входа обычно
крошечная заглушка кода. Эта заглушка просто
переходит к экспортируемой функции в
MSCOREE.DLL (_CorExeMain или
_CorDllMain). Оттуда MSCOREE берет на себя ответственность и начинает использовать
метаданные и IL из исполняемого файла
файл. Эта установка похожа на способ
приложения в Visual Basic (до .NET)
использовал MSVBVM60.DLL. Отправная точка
для .NET информация является
Структура IMAGE_COR20_HEADER,
в настоящее время определяется в CorHDR.H из
.NET Framework SDK и более поздние версии
версии WINNT.H.
IMAGE_COR20_HEADER указывает на
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
запись в DataDirectory. Рисунок 10
показывает поля
IMAGE_COR20_HEADER. Формат
метаданные, метод IL и другие вещи
на который указывает IMAGE_COR20_HEADER
будет описано в следующем
статья.