Поиск

"Hello, World" в MSIL

В диалоговом окне Run меню Start введите команду ildasm и щелкните ОК. Перед вами появится довольно невзрачного вида приложение с несколькими меню. В меню File выберите команду Open. В появившемся диалоговом окне File Open откройте папку с приложением HelloWorld.exe, которое вы создали чуть раньше, и выберите его. Как видите, работа с программой ILDASM сулит нам что-то интересное (рис. 3-4).

Заметьте, как представлен управляемый двоичный код в ILDASM. Ниже показаны значки, с помощью которых ILDASM показывает части .NET-приложения (рис. 3-5). Сравнив эти значки с представлением приложения "Hello, World" в ILDASM, можно заметить, что HelloWorld.exe состоит из декларации, одного класса (HelloWorld) и двух методов (конструктора класса и статического метода Main) и кое-какой информации о классе.

В приложении "Hello, World" наиболее интересен метод Main. Дважды щелкните значок метода Main в древовидной структуре приложения, и ILDASM выведет окно, отображающее MSIL-код метода Main (рис. 3-6).

Даже в виде 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), код.

Ключевое слово .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 и увидеть, что я имею в виду.

ПРИМЕЧАНИЕ Чтобы выяснить, какой код находится в файле ЕХЕ или DLL — управляемый или нет, попробуйте открыть его в ILDASM. Файл, содержащий MSIL-код и декларацию, будет открыт. В ином случае вы получите сообщение об ошибке, начинающееся фразой "<ваш файл > has no valid CLR header and cannot be disassembled-" (<ваш файл> не имеет надлежащего CLR-заголовка и не может быть дизассемблирован).