Шрифт:
Суть в том, что большинство меток кода совсем необязательно. Единственным случаем, когда метки кода оказываются по-настоящему полезными (и обязательными), является случай, когда в программном коде CIL используются ветвления или циклические конструкции. Например, в нашем случае вы можете исключить метки вообще.
Взаимодействие с CIL: модификация файла *.il
Теперь, когда вы понимаете, как компонуется базовый файл CIL, давайте завершим наш эксперимент с челночной технологией разработки программ. С помощью изменения CIL-кода в файле *.il мы должны выполнить следующее.
• Добавить ссылку на компоновочный блок System.Windows.Forms.dll.
• Загрузить локальную строку в Main.
• Вызвать метод System.Windows.Forms.MessageBox.Show, используя локальную строковую переменную в качестве его аргумента.
Первым шагом является добавление новой директивы.assembly (с атрибутом extern), которая укажет, что используется System.Windows.Forms.dll. Для этого просто добавьте в файл *.il следующую программную логику после ссылки на внешний компоновочный блок mscorlib.
Значение, указанное директивой .ver. может у вас оказаться другим, поскольку оно зависит от версии платформы .NET, установленной на вашей машине. Здесь указано использование System.Windows.Forms.dll версии 2.0.0.0 с кодом открытого ключа В77А5С561934Е089. Если открыть GAC (см. главу 11) и найти там компоновочный блок System.Windows.Forms.dll, можно скопировать правильный номер версии и значение открытого ключа со страницы свойств этого компоновочного блока.
Итак, целью является помещение новой строки в стек и вызов метода MessageBox.Show (а не метода Console.WriteLine). Напомним, что при указании имени внешнего типа следует использовать абсолютное имя типа (в совокупности с понятным именем компоновочного блока). С учетом этого обновите метод Main так, как показано ниже.
В результате вы получите программный код CIL, соответствующий следующему определению класса C#.
Компиляция CIL-кода с помощью ilasm.exe
Сохранив измененный файл *.il, вы можете скомпилировать новый компоновочный блок .NET, используя для этого утилиту ilasm.exe (компилятор CIL). Возможно, вы удивитесь тому, что компилятор CIL имеет гораздо меньше опций командной строки, чем компилятор C#. В табл. 15.1 приводятся их описания.
Таблица 15.1. Опции командной строки ilasm.exe
Опция | Описание |
---|---|
/debug | Включает информацию отладки (такую как имена локальных переменных и аргументов, а также номера строк) |
/dll | Создает выходной файл" *.dll |
/exe | Создает выходной файл *.exe. Это значение устанавливается по умолчанию, поэтому его можно опустить |
/key | Компилирует компоновочный блок со строгим именем, используя заданный файл *.snk |
/noautoinherit | Запрещает автоматическое наследование типов класса из System. Object, когда конкретный базовый класс не определен |
/output | Указывает имя и расширение выходного файла. Если флаг /output не используется, имя выходного файла будет соответствовать имени первого исходного файла |