Роль меток в программном коде CIL

Роль меток в программном коде CIL

Вы. конечно, заметили, что в каждой строке программного кода реализации содержится префикс в форме лексемы IL_XXX: (например, IL_0000: IL_0001: и т.д.). Эти лексемы называются метками кода, и они могут иметь любой вид, какой вы только пожелаете (лишь бы они не дублировались в пределах одного и того же контекста). При записи содержимого компоновочного блока в файл с помощью ildasm.exe автоматически генерируются метки кода, имеющие вид IL_XXX:. Но вы можете изменить их с тем, чтобы они стали более информативными.

.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 [mscorlib]System.Console::WriteLine(string)

 Nothing_2: nop

 WaitFor_KeyPress: call string [mscorlib] System.Console::ReadLine()

 RemoveValueFromStack: pop

 Leave_Functlon: ret

}

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

.method private hidebysig static void Main(string[] args) cil managed {

 .entrypoint

 .maxstack 8

 nop

 ldstr "Hello CIL code!"

 call void [mscorlib]System.Console::WriteLine(string)

 nop

 call string [mscorlib]System.Console::ReadLine()

 pop

 ret

}