call string [System.Console]System.Console::ReadLine()
pop
ret
}
Взаимодействие c CIL: модификация файла *.il
Теперь, когда вы имеете представление о том, из чего состоит базовый файл CIL, давайте завершим эксперимент с возвратным проектированием. Цель здесь довольно проста: изменить сообщение, которое выводится в окно консоли. Вы можете делать что-то большее, скажем, добавлять ссылки на сборки или создавать новые классы и методы, но мы ограничимся простым примером.
Чтобы внести изменение, вам понадобится модифицировать текущую реализацию операторов верхнего уровня, созданную в виде метода
*.il и измените сообщение на "Hello from altered CIL code!".Фактически код CIL был модифицирован для соответствия следующему определению на языке С#:
static void Main(string[] args)
{
Console.WriteLine("Hello from altered CIL code!");
Console.ReadLine();
}
Компиляция кода CIL
Предшествующие версии .NET позволяли компилировать файлы *.il
*.il вы должны использовать тип проекта Microsoft.NET.Sdk.IL. На момент написания главы он все еще не был частью стандартного комплекта SDK.Начните с создания нового каталога на своей машине. Создайте в этом каталоге файл global.json
{
"msbuild-sdks": {
"Microsoft.NET.Sdk.IL": "5.0.0-preview.1.20120.5"
}
}
На следующем шаге создается файл проекта. Создайте файл по имени RoundTrip.ilproj
5.0.0-preview.1.20120.5
MicrosoftNetCoreIlasmPackageVersion>
Наконец, скопируйте созданный файл RoundTrip.il
dotnet build
Результирующие файлы будут находиться, как обычно, в подкаталоге bin\debug\net5.0
Директивы и атрибуты CIL
Теперь, когда вы знаете, как преобразовывать сборки .NET Core в файлы *.il
*.il в сборки, можете переходить к более детальному исследованию синтаксиса и семантики языка CIL. В последующих разделах будет поэтапно рассматриваться процесс создания специального пространства имен, содержащего набор типов. Тем не менее, для простоты типы пока не будут иметь логики реализации своих членов. Разобравшись с созданием простых типов, можете переключить внимание на процесс определения "реальных" членов с использованием кодов операций CIL.Указание ссылок на внешние сборки в CIL
Скопируйте файлы global.json
NuGet.config из предыдущего примера в новый каталог проекта. Создайте новый файл проекта по имени CILTypes.ilproj, содержимое которого показано ниже:
5.0.0-preview.1.20120.5
Затем создайте в текстовом редакторе новый файл по имени CILTypes.il
System.Runtime.dll. В новом файле понадобится указать директиву .assembly с уточняющим атрибутом external. При добавлении ссылки на сборку со строгим именем, подобную System.Runtime.dll, также должны быть указаны директивы .publickeytoken и .ver:.assembly extern System.Runtime
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )
.ver 5:0:0:0
}
Определение текущей сборки в CIL
Следующее действие заключается в определении создаваемой сборки с использованием директивы .assembly
// Наша сборка.
.assembly CILTypes{}