Взаимодействие с CIL: модификация файла *.il
Взаимодействие с CIL: модификация файла *.il
Теперь, когда вы понимаете, как компонуется базовый файл CIL, давайте завершим наш эксперимент с челночной технологией разработки программ. С помощью изменения CIL-кода в файле *.il мы должны выполнить следующее.
• Добавить ссылку на компоновочный блок System.Windows.Forms.dll.
• Загрузить локальную строку в Main().
• Вызвать метод System.Windows.Forms.MessageBox.Show(), используя локальную строковую переменную в качестве его аргумента.
Первым шагом является добавление новой директивы.assembly (с атрибутом extern), которая укажет, что используется System.Windows.Forms.dll. Для этого просто добавьте в файл *.il следующую программную логику после ссылки на внешний компоновочный блок mscorlib.
.assembly extern System.Windows.Forms {
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
.ver 2:0:0:0
}
Значение, указанное директивой .ver. может у вас оказаться другим, поскольку оно зависит от версии платформы .NET, установленной на вашей машине. Здесь указано использование System.Windows.Forms.dll версии 2.0.0.0 с кодом открытого ключа В77А5С561934Е089. Если открыть GAC (см. главу 11) и найти там компоновочный блок System.Windows.Forms.dll, можно скопировать правильный номер версии и значение открытого ключа со страницы свойств этого компоновочного блока.
.method private hidebysig static void Main(string[] args) cil managed {
.entrypoint
.maxstack 8
// Задача: написать новый CIL-код.
}
Итак, целью является помещение новой строки в стек и вызов метода MessageBox.Show() (а не метода Console.WriteLine()). Напомним, что при указании имени внешнего типа следует использовать абсолютное имя типа (в совокупности с понятным именем компоновочного блока). С учетом этого обновите метод Main() так, как показано ниже.
.method private hidebysig static void Main(string[] args) cil managed {
.entrypoint
.maxstack 8
ldstr "CIL работает прекрасно!"
call valuetype [System.Windows.Forms] System.Windows.Forms.DialogResult [System.Windows.Forms] System.Windows.Forms.MessageBox::Show(string)
pop
ret
}
В результате вы получите программный код CIL, соответствующий следующему определению класса C#.
public class Program {
static void Main(string[] args) {
System.Windows.Forms.MessageBox.Show("CIL работает прекрасно!");
}
}