Что такое .netmodule и как он связан с управляемым модулем

Из CLR via C# я понял, что сборка состоит из управляемых модулей.
Управляемым модулем в .Net представлен .netmodule.

  1. Видимо начал путаться, и понимаю, что множество .netmodules составляют единый управляемый модуль, который в свою очередь является сборкой, так ли это?
  2. В многофайловых сборках, состоящих из нескольких .netmodule, в одном из моих вопросов был дан ответ, что .netmodule это почти как сборка, но только без манифеста, есть главный .netmodule в котором определен манифест. Главный модуль представлен exe или dll расширением, получается манифест сборки указывает какое должно быть расширение?

Вытекает еще один вопрос, в структуре .netmodule есть PE заголовок, который определяет тип файла, получается там, если можно так сказать, до установки в него манифеста указано, что файл имеет тип .netmodule, а при установке в него манифеста сборки-этот тип меняется на dll или exe?


Ответы (1 шт):

Автор решения: MSDN.WhiteKnight

.netmodule - это просто расширение по умолчанию для файла, генерируемого компиляторами C#/VB при компиляции с параметром -target:module, или Visual C++ с параметром /LN. Конечно, любой файл .netmodule является управляемым модулем, но обратное утверждение неверно. Считайте, что это разновидность управляемого модуля.

Файл .netmodule представляет из себя PE-файл с метаданными .NET и, возможно, секцией CIL-кода, но без манифеста сборки, т.е., того что представлено директивой .assembly в выводе ildasm. Условно назовем такой файл неполный модуль. Его нельзя загрузить и выполнить, но можно подать на вход специальных утилит, что подробно описано в ответе на вопрос Можно ли назвать сборку многомодульной. Само расширение нигде в спецификациях вроде не прописано, то есть теоретически неполному модулю можно присвоить и расширение .dll. Но не факт, что любая утилита обработает его корректно в этом случае.

DLL или EXE файл, получаемый при обычной компиляции, можно в противоположность .netmodule назвать полным модулем. Тогда получаем такие возможные конфигурации структуры сборок:

Однофайловая сборка:  { [Полный модуль] }

Многофайловая сборка: { [Полный модуль] [Неполный модуль 1] ... [Неполный модуль N]}
→ Ссылка