Даже в виде MSIL наше приложение не стало более привлекательным, зато теперь из него можно выудить нечто такое, что характерно для любого .NET-приложения. Разберем-ка этот метод по косточкам.
.method public hidebysig static void MainQ 11 managed {
.entrypoint
// Code size 11 (Oxb)
.maxstack 8
IL_0000: Idstr "Hello, World"
IL_0005: call void [mscorlib]System.Console:iWriteLine (class System.String)
IL_OOOa: ret }// end of method HelloWorld::Main
Первая строка содержит описание метода
Main
с помощью ключевого слова
.method.
Можно заметить, что в этом описании есть модификаторы
public
(открытый) и
static
(статический), устанавливаемые для
Main
по умолчанию. Кроме того, метод имеет атрибут
managed
(управляемый код). Это важная отличительная особенность, так как на С# можно создать и "неуправляемый" (unmanaged), или "небезопасный" (unsafe), код. Неуправляемому С#-коду посвящена глава 17.
Ключевое слово
.entrypoint
в следующей строке MSIL-кода указывает на то, что данный метод является точкой входа приложения. Когда исполняющая среда запускает приложение, управление программой передается коду, следующему за этой точкой.
Вызывают интерес и исполняемые коды в строках IL_0000 и IL_0005. В первой команда
Idstr
(Load String) загружает в стек неизменяемый литерал ("Hello, World"). В следующей строке вызывается метод
System.Con-sole. WriteLine.
Заметьте: к имени метода добавлено имя сборки (assembly), в которой описан метод. Такой уровень детализации MSIL хорош тем, что вы без труда напишете утилиту которая выявит связи в программе и отобразит информацию о файлах, требующихся для правильной работы приложения. Кроме того, вы можете определить число аргументов метода и их типы. В нашем случае метод
System.Console. WriteLine
принимает объект
System.String,
который перед вызовом метода должен быть помещен в стек. И, наконец, в строке IL_OOOa находится исполняемый MSIL-код
ret —
код возврата из метода.
ILDASM — мощный инструмент. Когда я упоминаю MSIL-код, сгенерированный компилятором С#, вы можете запустить ILDASM и увидеть, что я имею в виду.