Принципы объектно-ориентированного программирования

         

Чтобы увидеть MSIL-код метода, откройте двоичный файл в ILDASM и дважды щелкните этот метод.



Чтобы увидеть MSIL-код метода, откройте двоичный файл в ILDASM и дважды щелкните этот метод.

Даже в виде 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 и увидеть, что я имею в виду.



Содержание раздела