Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
IL_0011: ret } // end of method '<Program>$'::'<Main>$'Роль меток в коде CIL
Вы определенно заметили, что каждая строка в коде реализации предваряется лексемой в форме
IL_XIL_0000:IL_0001:ildasm.exeIL_XXXX:.method private hidebysig static void Main(string[] args) cil managed{ .entrypoint .maxstack 8 Nothing_1: nop Load_String: ldstr "Hello CIL code!" PrintToConsole: call void [System.Console]System.Console::WriteLine(string) Nothing_2: nop WaitFor_KeyPress: call string [System.Console]System.Console::ReadLine() RemoveValueFromStack: pop Leave_Function: ret}В сущности, большая часть меток кода совершенно не обязательна. Единственный случай, когда метки кода по-настоящему необходимы, связан с написанием кода CIL, в котором используются разнообразные конструкции ветвления или организации циклов, т.к. с помощью меток можно указывать, куда должен быть направлен поток логики. В текущем примере все автоматически сгенерированные метки кода можно удалить безо всяких последствий:
.method private hidebysig static void Main(string[] args) cil managed{ .entrypoint .maxstack 8 nop ldstr "Hello CIL code!" call void [System.Console]System.Console::WriteLine(string) nop call string [System.Console]System.Console::ReadLine() pop ret}Взаимодействие c CIL: модификация файла *.il
Теперь, когда вы имеете представление о том, из чего состоит базовый файл CIL, давайте завершим эксперимент с возвратным проектированием. Цель здесь довольно проста: изменить сообщение, которое выводится в окно консоли. Вы можете делать что-то большее, скажем, добавлять ссылки на сборки или создавать новые классы и методы, но мы ограничимся простым примером.
Чтобы внести изменение, вам понадобится модифицировать текущую реализацию операторов верхнего уровня, созданную в виде метода
<Main>$()*.il"Hello from altered CIL code!"Фактически код CIL был модифицирован для соответствия следующему определению на языке С#:
static void Main(string[] args){ Console.WriteLine("Hello from altered CIL code!"); Console.ReadLine();}Компиляция кода CIL
Предшествующие версии .NET позволяли компилировать файлы
*.il*.ilMicrosoft.NET.Sdk.ILНачните с создания нового каталога на своей машине. Создайте в этом каталоге файл
global.json{ "msbuild-sdks": { "Microsoft.NET.Sdk.IL": "5.0.0-preview.1.20120.5" }}На следующем шаге создается файл проекта. Создайте файл по имени
RoundTrip.ilproj<Project Sdk="Microsoft.NET.Sdk.IL"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5.0</TargetFramework> <MicrosoftNetCoreIlasmPackageVersion> 5.0.0-preview.1.20120.5 </MicrosoftNetCoreIlasmPackageVersion> <ProduceReferenceAssembly>false</ProduceReferenceAssembly> </PropertyGroup></Project>Наконец, скопируйте созданный файл
RoundTrip.ildotnet buildРезультирующие файлы будут находиться, как обычно, в подкаталоге
bindebugnet5.0Директивы и атрибуты CIL
Теперь, когда вы знаете, как преобразовывать сборки .NET Core в файлы
*.il*.ilПохожие книги на "Язык программирования C#9 и платформа .NET5", Троелсен Эндрю
Троелсен Эндрю читать все книги автора по порядку
Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки mir-knigi.info.