Рабочим названием платформы .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