Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Сборки являются самоописательными

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

В дополнение к данным манифеста сборка содержит метаданные, которые описывают структуру каждого содержащегося в ней типа (имена членов, реализуемые интерфейсы, базовые классы, конструкторы и т.п.). Благодаря тому, что сборка настолько детально документирована, среда .NET Core Runtime не нуждается в обращении

к реестру Windows для выяснения ее местонахождения (что радикально отличается от унаследованной модели программирования СОМ от Microsoft). Такое отделение от реестра является одним из факторов, которые позволяют приложениям .NET Core функционировать под управлением других операционных систем (ОС) помимо Windows, а также обеспечивают поддержку на одной машине множества версий платформы .NET Core.

В текущей главе вы узнаете, что для получения информации о местонахождении внешних библиотек кода среда .NET Core Runtime применяет совершенно новую схему.

Формат сборки .NET Core

Теперь, когда вы узнали о многих преимуществах сборок .NET Core, давайте более детально рассмотрим, как такие сборки устроены внутри. Говоря о структуре, сборка .NET Core (

*.dll
или
*.ехе
) состоит из следующих элементов:

• заголовок файла ОС (например, Windows);

• заголовок файла CLR;

• код CIL;

• метаданные типов;

• манифест сборки;

• дополнительные встроенные ресурсы.

Несмотря на то что первые два элемента (заголовки ОС и CLR) представляют собой блоки данных, которые обычно можно игнорировать, краткого рассмотрения они все же заслуживают. Ниже приведен обзор всех перечисленных элементов.

Установка инструментов профилирования C++

В последующих нескольких разделах используется утилита по имени

dumpbin.ехе
, которая входит в состав инструментов профилирования C++. Чтобы установить их, введите C++ profiling в поле быстрого поиска и щелкните на подсказке Install C++ profiling tools (Установить инструменты профилирования C++), как показано на рис. 16.2.

В результате запустится установщик Visual Studio с выбранными инструментами. В качестве альтернативы можете запустить установщик Visual Studio самостоятельно и выбрать необходимые компоненты (рис. 16.3).

Заголовок файла операционной системы (Windows)

Заголовок файла ОС устанавливает факт того, что сборку можно загружать и манипулировать ею в среде целевой ОС (Windows в рассматриваемом примере). Данные в этом заголовке также идентифицируют вид приложения (консольное, с графическим пользовательским интерфейсом или библиотека кода

*.dll
), которое должно обслуживаться ОС.

Откройте файл

CarLibrary.dll
(в хранилище GitHub для книги или созданный позже в главе) с применением утилиты
dumpbin.ехе
(в окне командной строки разработчика), указав ей флаг
/headers
:

dumpbin /headers CarLibrary.dll

В результате отобразится информация заголовка файла ОС сборки, построенной для Windows, часть которой показана ниже:

Dump of file carlibrary.dll

PE signature found

File Type: DLL

FILE HEADER VALUES

14C machine (x86)

3 number of sections

BB89DC3D time date stamp

0 file pointer to symbol table

0 number of symbols

E0 size of optional header

2022 characteristics

Executable

Application can handle large (>2GB) addresses

DLL

...

Дамп
файла CarLibrary.dll

Обнаружена подпись РЕ

Тип файла: DLL

Значения заголовка файла

14С машина (х86)

3 количество разделов

BB89DC3D дата и время

0 файловый указатель на таблицу символов

0 количество символов

Е0 размер необязательного заголовка

2022 характеристики

Исполняемый файл

Приложение может обрабатывать большие (> 2 Гбайт) адреса

DLL

...

Запомните, что подавляющему большинству программистов, использующих .NET Core, никогда не придется беспокоиться о формате данных заголовков, встроенных в сборку .NET Core. Если только вы не занимаетесь разработкой нового компилятора языка .NET Core (в таком случае вы обязаны позаботиться о подобной информации), то можете не вникать в тонкие детали заголовков. Однако помните, что такая информация потребляется "за кулисами", когда ОС загружает двоичный образ в память.

Заголовок файла CLR

Заголовок файла CLR — это блок данных, который должны поддерживать все сборки .NET Core (и благодаря компилятору C# они его поддерживают), чтобы обслуживаться средой .NET Core Runtime. Выражаясь кратко, в заголовке CLR определены многочисленные флаги, которые позволяют исполняющей среде воспринимать компоновку управляемого файла. Например, существуют флаги, идентифицирующие местоположение метаданных и ресурсов внутри файла, версию исполняющей среды, для которой была построена сборка, значение (необязательного) открытого ключа и т.д. Снова запустите утилиту

dumpbin.exe
, указав флаг
/clrheader
:

dumpbin /clrheader CarLibrary.dll

Вы увидите внутреннюю информацию заголовка файла CLR для заданной сборки .NET Core:

Dump of file CarLibrary.dll

File Type: DLL

clr Header:

48 cb

2.05 runtime version

2158 [ B7C] RVA [size] of MetaData Directory

1 flags

IL Only

0 entry point token

0 [ 0] RVA [size] of Resources Directory

0 [ 0] RVA [size] of StrongNameSignature Directory

0 [ 0] RVA [size] of CodeManagerTable Directory

0 [ 0] RVA [size] of VTableFixups Directory

0 [ 0] RVA [size] of ExportAddressTableJumps Directory

0 [ 0] RVA [size] of ManagedNativeHeader Directory

Summary

Поделиться с друзьями: