.hash algorithm 0х00008004
.ver 1:0:0:0
}
.modulе СILCars.dll
Как уже было сказано, этот компоновочный блок будет содержать два типа класса. Первый тип, CILCar, определяет два поля данных и пользовательский конструктор. Второй тип, CarInfoHelper, определяет единственный статический метод с именем DisplayCarInfо, который использует CILCar в качестве параметра и возвращает void. Оба типа находятся в пространстве имен CILCars. В терминах CIL класс CILCar можно реализовать так.
// Реализация типа CILCars.CILCar.
.namespace CILCars {
.class public auto ansi beforefieldinit CILCar extends [mscorlib]System.Object {
// Поле данных CILCar.
.field public string petName
.field public int32 currSpeed
// Пользовательский конструктор, который дает пользователю
// возможность присвоить полю данные.
.method public hidebysig specialname rtspecialname instance void .ctor(int32 c, string p) cil managed {
.maxstack 8
// Загрузка первого аргумента в стек и вызов
// конструктора базового класса.
ldarg.0 // объект 'this', а не int32!
call instance void [mscorlib]System.Object::.ctor
// Теперь загрузка первого и второго аргументов в стек.
ldarg.0 // объект 'this'
ldarg.1 // аргумент int32
// Сохранение элемента вершины стека (int 32) в поле currSpeed.
stfld int32 CILCars.CILCar::currSpeed
// Загрузка строкового аргумента и сохранение в поле petName.
ldarg.0 // объект 'this'
ldarg.2 // аргумент string
stfld string CILCars.CILCar::petName
ret
}
}
}
Имея в виду, что настоящим первым аргументом любого нестатического члена является объектная ссылка this, в первом блоке CIL-кода мы просто загружаем эту объектную ссылку и вызываем конструктор базового класса. Затем поступающие аргументы конструктора помещаются в стек и запоминаются в полях данных типа с помощью кода операции stfld (сохранение в поле).
Далее, вы должны реализовать второй тип в данном пространстве имен, а именно тип CILCarInfo. Суть типа находится в статическом методе Display. Основной задачей этого метода является получение поступающего параметра CILCar, извлечение значения поля данных и вывод его в окне сообщения Windows Forms. Вот полная реализация CILCarInfo, а далее следует ее анализ.
.class public auto ansi beforefieldinit CILCarInfo extends [mscorlib]System.Object {
.method public hidebysig static void Display(class CILCars.CILCar c) cil managed {
.maxstасk 8
// Нам нужна локальная строковая переменная.
.locals init ([0] string caption)
// Загрузка строки и входного CILCar в стек.
ldstr "Скорость [0]: "
ldarg.0
// Помещение значения petName класса CILCar в стек и
// вызов статического метода String.Format.
ldfld string CILCars.CILCar::petName
call string [mscorlib]System.String::Format(string, object)
stloc.0
// Загрузка значения поля currSpeed и получение его строкового // представления (обратите внимание на вызов ToString).
ldarg.0
ldflda int32 CILCars.CILCar::currSpeed
call instance string [mscorlib]System.Int32::ToString
ldloc.0
// Вызов метода MessageBox.Show с загруженными значениями.