Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
ildasm /all /METADATA /out=CarLibrary.il
.CarLibrarybinDebugnet5.0CarLibrary.dll
Раздел манифеста
Manifest
//Metadata version: 4.0.30319
// Metadata version: v4.0.30319
.assembly extern System.Runtime
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )
.ver 5:0:0:0
}
.assembly extern System.Console
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )
.ver 5:0:0:0
}
Каждый блок
.assembly extern
.publickeytoken
.ver
.publickeytoken
.ver
На заметку! Предшествующие версии .NET Framework в большой степени полагались на назначение строгих имен, которые вовлекали комбинацию открытого и секретного ключей. Это требовалось в среде Windows для сборок, подлежащих добавлению в глобальный кеш сборок, но с выходом .NET Core необходимость в строгих именах значительно снизилась.
После ссылок на внешние сборки вы обнаружите несколько маркеров .custom, которые идентифицируют атрибуты уровня сборки (кроме маркеров, сгенерированных системой, также информацию об авторском праве, название компании, версию сборки и т.д.). Ниже приведена (совсем) небольшая часть этой порции данных манифеста:
.assembly CarLibrary
{
...
.custom instance void ... TargetFrameworkAttribute ...
.custom instance void ... AssemblyCompanyAttribute ...
.custom instance void ... AssemblyConfigurationAttribute ...
.custom instance void ... AssemblyFileVersionAttribute ...
.custom instance void ... AssemblyProductAttribute ...
.custom instance void ... AssemblyTitleAttribute ...
Такие настройки могут устанавливаться либо с применением окна свойств проекта в Visual Studio, либо путем редактирования файла проекта и добавления надлежащих элементов. Находясь в среде Visual Studio, щелкните правой кнопкой мыши на имени проекта в окне Solution Explorer, выберите в контекстном меню пункт Properties (Свойства) и перейдите не вкладку Package (Пакет) в левой части открывшегося диалогового окна (рис. 16.4).

Добавить метаданные к сборке можно и прямо в файле проекта
*.csproj
PropertyGroup
<PropertyGroup>
<b> <TargetFramework>net5.0</TargetFramework></b>
<b> <Copyright>Copyright 2020</Copyright></b>
<b> <Authors>Phil Japikse</Authors></b>
<b> <Company>Apress</Company></b>
<b> <Product>Pro C# 9.0</Product></b>
<b> <PackageId>CarLibrary</PackageId></b>
<b> <Description>This is an awesome library for cars.</Description></b>
<b> <AssemblyVersion>1.0.0.1</AssemblyVersion></b>
<b> <FileVersion>1.0.0.2</FileVersion></b>
<b> <Version>1.0.0.3</Version></b>
</PropertyGroup>
На заметку! Остальные поля информации о сборке на рис. 16.4 (и в показанном выше содержимом файла проекта) используются при генерировании пакетов NuGet из вашей сборки. Данная тема раскрывается позже в главе.
Исследование кода CIL
Вспомните, что сборка не содержит инструкций, специфичных для платформы; взамен в ней хранятся инструкции на независимом от платформы общем промежуточном языке (Common Intermediate Language — CIL). Когда исполняющая среда .NET Core загружает сборку в память, ее внутренний код CIL компилируется (с использованием JIT-компилятора) в инструкции, воспринимаемые целевой платформой. Например, метод
TurboBoost()
SportsCar
.method public hidebysig virtual
instance void TurboBoost() cil managed
{
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Ramming speed! Faster is better..."
IL_0006: call void [System.Console]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
}
// end of method SportsCar::TurboBoost
Большинству разработчиков приложений .NET Core нет необходимости глубоко погружаться в детали кода CIL. В главе 19 будут приведены дополнительные сведения о синтаксисе и семантике языка CIL, которые могут быть полезны при построении более сложных приложений, требующих расширенных действий вроде конструирования сборок во время выполнения.