Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Взаимодействие с 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 работает прекрасно!");
 }
}

Оглавление книги


Генерация: 1.612. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз