| Рабочим названием платформы .NET было |
Язык CIL: обработка исключений. Синтаксис ILASM
Пример программы
Давайте рассмотрим пример программы, написанной прямо на CIL с использованием синтаксиса ILASM. Мы не станем приводить весь текст программы сразу, а будем рассматривать ее постепенно, по частям.
Естественно, наша программа будет начинаться с заголовка, объявляющего имена сборки и модуля и импортирующего стандартную библиотеку:
.assembly Sample1 { }
.module sample1.exe
.assembly extern mscorlib { }Далее объявим тип-значение Point, реализующий понятие точки на плоскости. Он будет содержать два поля x и y типа float64, а также конструктор и статический метод, вычисляющий расстояние между двумя точками:
.class public sealed Point extends [mscorlib]System.ValueType
{
.field public float64 x
.field public float64 y
.method public void .ctor (float64 x, float64 y)
{
.maxstack 3
ldarg.0
dup
ldarg.1
stfld float64 Point::x
ldarg.2
stfld float64 Point::y
ret
}
.method public static float64 Distance
(valuetype Point a, valuetype Point b)
{
.maxstack 3
ldarga a
ldfld float64 Point::x
ldarga b
ldfld float64 Point::x
sub
dup
mul
ldarga a
ldfld float64 Point::y
ldarga b
ldfld float64 Point::y
sub
dup
mul
add
call float64 [mscorlib]System.Math::Sqrt(float64)
ret
}
}А теперь объявим вспомогательный класс SampleClass, который будет содержать точку входа в нашу сборку. Метод Demo (точка входа) будет вычислять расстояние между точками (0.0,0.0) и (1.0,1.0) и выводить результат на экран:
.class public SampleClass
{
.method public static void Demo()
{
.entrypoint
.maxstack 3
ldc.r8 0.0
ldc.r8 0.0
newobj void Point::.ctor(float64,float64)
ldc.r8 1.0
ldc.r8 1.0
newobj void Point::.ctor(float64,float64)
call float64 Point::Distance(valuetype Point, valuetype Point)
call void [mscorlib]System.Console::WriteLine (float64)
ret
}
}Откомпилируем нашу программу, которая записана в текстовом файле sample1.il. Подразумевается, что мы работаем в Windows и у нас переменная окружения path настроена таким образом, что программы ILASM и PEVERIFY можно вызывать без указания путей. Наберем в консоли команду:
ilasm sample1.il
Мы получим следующее сообщение от компилятора ILASM:
Microsoft (R) .NET Framework IL Assembler. Version 1.1.4322.573 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. Assembling 'sample1.il', no listing file, to EXE --> 'sample1.EXE' Source file is ANSI Assembled method Point::.ctor Assembled method Point::Distance Assembled method SampleClass::Demo Creating PE file Emitting members: Global Class 1 Fields: 2; Methods: 2; Class 2 Methods: 1; Resolving member refs: 9 -> 9 defs, 0 refs Writing PE file Operation completed successfully
Итак, наша программа успешно откомпилировалась и на диске появилась сборка sample1.exe. Попробуем провести ее верификацию:
peverify sample1.exe
В ответ верификатор выведет на экран:
Microsoft (R) .NET Framework PE Verifier Version 1.1.4322.573 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. All Classes and Methods in sample1.exe Verified
Таким образом, сборка успешно прошла верификацию и мы можем рискнуть ее запустить:
sample1.exe
В результате на экран выводится расстояние между точками (0.0,0.0) и (1.0,1.0):
1, 4142135623731