Рабочим названием платформы .NET было |
Язык CIL: обработка исключений. Синтаксис ILASM
Синтаксис
IL-программа представляет собой последовательность объявлений.
В этом разделе мы рассмотрим синтаксис объявлений следующих элементов IL-программы:
- сборка;
- модуль;
- тип;
- поле;
- метод.
Сборки и модули
Каждый IL-файл для ассемблера ILASM представляет собой отдельный модуль сборки. Мы не будем касаться вопросов компиляции сборки, состоящей из нескольких модулей, поэтому приведем образец заголовка IL-файла для одномодульной сборки:
.assembly MyProgram { } .module MyProgram.exe .assembly extern mscorlib { }
В заголовке используются три директивы: директива ".assembly" позволяет задать имя нашей сборки. Директива ".module" определяет имя модуля и совпадает с именем исполняемого файла, в который будет записана откомпилированная сборка. Директива ".assembly extern" указывает, что мы будем импортировать сборку mscorlib, в которой находится основная часть библиотеки классов .NET. В фигурных скобках после имени сборки могут перечисляться свойства сборки, но в простейшем случае их можно оставить пустыми.
Типы
Объявление типа осуществляется с помощью директивы ".class" и состоит из четырех частей:
- последовательность атрибутов типа;
- имя типа;
- базовый тип;
- список реализуемых интерфейсов.
Последовательность атрибутов следует непосредственно после ключевого слова ".class". В таблице 3.51 приведен набор наиболее часто используемых атрибутов.
После атрибутов следует идентификатор, задающий имя объявляемого типа.
Если объявляемый тип наследует от какого-нибудь другого типа (базового класса), отличного от System.Object, то необходимо указать имя базового класса после ключевого слова "extends". При этом, если в качестве базового класса выбран System.ValueType, то объявляемый тип будет типом-значением.
Если объявляемый тип реализует методы каких-либо интерфейсов, то должен быть приведен список этих интерфейсов после ключевого слова "implements".
Рассмотрим несколько примеров:
- Объявление экспортируемого абстрактного класса, реализующего интерфейс IEnumerable.
.class public abstract MyAbstractClass extends [mscorlib]System.Object implements [mscorlib]System.Collections.IEnumerable { }
- Объявление неэкспортируемого интерфейса.
.class private interface MyInterface { }
- Объявление экспортируемого типа-значения.
.class public sealed MyValueType extends [mscorlib]System.ValueType { }
Обратите внимание, что перед именами библиотечных классов и интерфейсов в квадратных скобках указывается имя сборки, в которой они содержатся.
Поля
Поля объявляются внутри объявлений типов. Объявление поля осуществляется с помощью директивы ".field" и состоит из трех частей:
- последовательность атрибутов поля;
- тип;
- имя поля.
Последовательность атрибутов следует непосредственно после ключевого слова ".field". В таблице 3.52 приведен набор наиболее часто используемых атрибутов.
Атрибут | Описание |
---|---|
assembly | Поле видимо внутри сборки |
family | Поле видимо для наследников типа |
public | Поле видимо для всех |
private | Поле видимо только внутри типа |
static | Поле является статическим |
После атрибутов следует тип поля и идентификатор, задающий имя поля.
Рассмотрим несколько примеров:
- Объявление поля x типа массив.
.field private int32[] x
- Объявление поля table типа Hashtable.
.field public class [mscorlib]System.Collections.Hashtable table
Методы
Методы объявляются внутри объявлений типов. Объявление метода осуществляется с помощью директивы ".method" и состоит из пяти частей:
- последовательность атрибутов метода;
- тип возвращаемого значения;
- имя метода;
- список параметров метода;
- тело метода.
Последовательность атрибутов следует непосредственно после ключевого слова ".method". В таблице 3.53 приведен набор наиболее часто используемых атрибутов.
После атрибутов следует тип возвращаемого значения и идентификатор, задающий имя метода. Если метод не возвращает значения, в качестве типа возвращаемого значения указывается void. Конструкторы всегда имеют имя ".ctor", а статические конструкторы - ".cctor".
Атрибут | Описание |
---|---|
assembly | Метод видим внутри сборки |
family | Метод видим для наследников типа |
public | Метод видим для всех |
private | Метод видим только внутри типа |
abstract | Метод является абстрактным |
virtual | Метод является виртуальным |
final | Метод не может переопределяться в наследниках |
static | Метод является статическим |
Список параметров метода следует за именем метода и заключается в круглые скобки. Для каждого параметра указывается его тип и имя.
Прежде чем перейти к рассмотрению синтаксиса объявлений тел методов, приведем несколько примеров заголовков методов:
- Объявление конструктора с двумя параметрами.
.method public void .ctor (int32 x, class [mscorlib]System.String s)
-
Виртуальный метод с управляемым указателем в качестве параметра.
.method private virtual int32 myMethod(int32& pX)
- Статический метод, возвращающий массив:
.method public static int32[] MyStaticMethod()
Тело метода заключается в фигурные скобки и содержит инструкции языка CIL. Каждая инструкция записывается на новой строке программы. Если нужно, то инструкции может предшествовать метка, отделяемая от инструкции двоеточием. Например:
Hello: ldstr "Hello, World!" call void [mscorlib]System.Console.WriteLine(string)
Кроме инструкций CIL тело метода может содержать директивы тела метода. Они перечислены в таблице 3.54.