Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
Запустите
ildasm.exe
RoundTrip.dll
ildasm /all /METADATA /out=.RoundTripRoundTrip.il
.RoundTripbinDebugnet5.0RoundTrip.dll
На заметку! При сбрасывании содержимого сборки в файл утилита
ildasm.exe
*.res
Теперь можете просмотреть файл
RoundTrip.il
<b>// Ссылаемые сборки.</b>
.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
}
<b>// Наша сборка.</b>
.assembly RoundTrip
{
...
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module RoundTrip.dll
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003
.corflags 0x00000001
<b>// Определение класса Program.</b>
.class private abstract auto ansi beforefieldinit '<Program>$'
extends [System.Runtime]System.Object
{
.custom instance void [System.Runtime]System.Runtime.CompilerServices
.
CompilerGeneratedAttribute::.ctor()
= ( 01 00 00 00 )
.method private hidebysig static void '<Main>$'(string[] args) cil managed
{
<b> // Помечает этот метод как точку входа исполняемой сборки.</b>
.entrypoint
.maxstack 8
IL_0000: ldstr "Hello CIL code!"
IL_0005: call void [System.Console]System.Console::WriteLine(string)
IL_000a: nop
IL_000b: call string [System.Console]System.Console::ReadLine()
IL_0010: pop
IL_0011: ret
} // end of method '<Program>$'::'<Main>$'
} // end of class '<Program>$'
Обратите внимание, что файл
*.il
System.Runtime
System.Console
.assembly extern
Далее следует формальное определение сборки
RoundTrip.dll
.module
.imagebase
После документирования внешних ссылаемых сборок и определения текущей сборки находится определение типа
Program
.class
extends
.class private abstract auto ansi beforefieldinit '<Program>$'
extends [System.Runtime]System.Object
{ ... }
Основной объем кода CIL представляет реализацию стандартного конструктора класса и автоматически сгенерированного метода
Main()
.method
Важно понимать, что при взаимодействии с типами .NET Core (такими как System.Console) в CIL всегда необходимо использовать полностью заданное имя типа. Более того, полностью заданное имя типа всегда должно предваряться префиксом в форме дружественного имени сборки, где определен тип (в квадратных скобках). Взгляните на следующую реализацию метода
Main()
.method private hidebysig static void '<Main>$'(string[] args) cil managed
{
<b> // Помечает этот метод как точку входа исполняемой сборки.</b>
.entrypoint
.maxstack 8
IL_0000: ldstr "Hello CIL code!"
IL_0005: call void [System.Console]System.Console::WriteLine(string)
IL_000a: nop
IL_000b: call string [System.Console]System.Console::ReadLine()
IL_0010: pop