Модули, сборки, заголовки в CLR

Я читал CLR с С# 3.0, и я размышлял о сборках, модулях и заголовках, однако все усложнилось. Это то, что я понял, но если было бы здорово, если бы кто-то мог прояснить ситуацию немного больше:

  • Модули являются результатом csc.exe, который содержит IL-код и таблицы метаданных. Таблицы метаданных содержат три разные таблицы:

    • Таблицы определения, такие как "ModuleDef, TypeDef, PropertyDef, MethodDef, EventDef, FieldDef"
    • Справочные таблицы, такие как "TypeRef, ModuleRef, MemberRef и т.д.".
    • Таблицы манифеста **
  • Ассембли - это контейнеры, которые содержат много модулей, а также такие ресурсы, как изображения, документы, pdf и т.д.

  • Файлы PE, предназначенные для Portable Executable, могут быть:.EXE или .DLL. Эти файлы имеют заголовки PE32 или PE32 +, заголовки CLR, метаданные, код IL.

В книгах говорится, что сборка представляет собой контейнер, состоящий из модулей, и он также говорит, что управляемый модуль

Управляемый модуль:

Управляемый модуль - это стандартный 32-разрядный перенос Microsoft Windows исполняемый файл (PE32) или стандартный 64-разрядный перенос Windows исполняемый файл (PE32 +), требующий выполнения CLR.

Рихтер, Джеффри (2010-02-05). CLR через С# (Kindle Locations 696-697). OReilly Media - A. Kindle Edition.

Определение сборки:

Сборка - это логическая группировка одного или нескольких модулей или ресурсов файлы.

Рихтер, Джеффри (2010-02-05). CLR через С# (Kindle Locations 766-767). OReilly Media - A. Kindle Edition.

enter image description here

Итак, кажется, что управляемый модуль на самом деле является частью сборки в изображении, взятом из той же книги.

Заголовки PE32 принадлежат Ассамблям, однако автор также говорит, что он принадлежит к управляемым модулям, и т.д.

Какое разделение здесь? Почему он использовал взаимозаменяемые модули и сборки, даже думая, что они выглядят достаточно раздельными.

Управляемый файл PE имеет четыре основные части: заголовок PE32 (+), CLR заголовка, метаданных и IL. Заголовок PE32 (+) является стандартным информацию, которую ожидает Windows. Заголовок CLR представляет собой небольшой блок информация, относящаяся к модулям, для которых требуется CLR (управляемая модули).

Рихтер, Джеффри (2010-02-05). CLR через С# (Kindle Locations 1628-1629 года). OReilly Media - A. Kindle Edition.

Также изображение ясно показывает, что модули имеют только метаданные, а не PE32 (+), заголовки CLR и т.д. Как вы думаете, можно ли использовать манифест и метаданные взаимозаменяемо?

А также не могли бы вы объяснить ** Таблицы манифеста в модулях?

Ответ 1

То, что вы разместили, немного застенчиво, как встроенная управляемая сборка в файл PE32. Это очень гибкий формат, первоначально предназначенный для хранения собственного исполняемого кода и ресурсов, но достаточно гибкого для хранения данных. На самом деле это сборка с точки зрения Windows. Только CLR может превратить эти данные во что-то исполняемое.

Файл PE32 содержит не только сборку. В нем есть и собственный код. 5 байтов для чистых управляемых сборок. Он имеет инструкцию перехода в mscoree.dll, загрузчик для управляемого кода. EXE содержит переход к _CorExeMain, DLL содержит переход к _CorDllMain. Это дополнительно расширено для сборщиков смешанного режима, примерами являются System.Data.dll и PresentationCore.dll. У них в них большие куски собственного кода, код, который обернут управляемыми классами. Компилятор С++/CLI и компоновщик - это способ создания таких сборок. Раздел .text содержит код, раздел .reloc содержит информацию о перемещении, которая помогает DLL загружаться с произвольным адресом в памяти.

Большинство файлов PE32 также содержат неуправляемые ресурсы. Формат, который понимает Windows. Это хранится в разделе .rsrc. Например, компилятор С# автоматически создает там ресурсы, что вы можете переопределить с помощью опции /win 32res. Вы можете увидеть это с помощью File + Open + File и выбрать сборку. Есть три важных:

  • RT_MANIFEST, содержит манифест с идентификатором ресурса 1. То, что Windows должно понять, что программа на С# совместима с UAC. Вы создаете свой собственный манифест, добавляя в манифест файла приложения файл.
  • ICON, содержит один значок, выбранный в качестве значка по умолчанию для ярлыка на рабочем столе
  • Версия содержит ресурс неуправляемой версии. Видимый на странице свойств "Сведения о проводнике", синтезированный компилятором из атрибутов сборки в AssemblyInfo.cs

Dumpbin.exe - это инструмент для просмотра внутри файла PE32. К сожалению, он знает об управляемых ассамблях, чтобы вы не могли видеть все.

Ответ 2

Книга Рихтера замечательная, но "истина" определена в стандарте CLI ECMA.
Пожалуйста, ознакомьтесь с главой 5 "Термины и определения" для определения в соответствии с официальным стандартом.
Я думаю, вы поймете общие черты и различия между различными терминами, которые лучше всего подходят для поиска определений.