Опубликован: 28.06.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный технический университет им. Н.Э. Баумана
Лекция 7:

Язык CIL: обработка исключений. Синтаксис ILASM

< Лекция 6 || Лекция 7: 123456 || Лекция 8 >

Синтаксис

IL-программа представляет собой последовательность объявлений.

В этом разделе мы рассмотрим синтаксис объявлений следующих элементов IL-программы:

  • сборка;
  • модуль;
  • тип;
  • поле;
  • метод.
Сборки и модули

Каждый IL-файл для ассемблера ILASM представляет собой отдельный модуль сборки. Мы не будем касаться вопросов компиляции сборки, состоящей из нескольких модулей, поэтому приведем образец заголовка IL-файла для одномодульной сборки:

.assembly MyProgram { }
.module MyProgram.exe
.assembly extern mscorlib { }

В заголовке используются три директивы: директива ".assembly" позволяет задать имя нашей сборки. Директива ".module" определяет имя модуля и совпадает с именем исполняемого файла, в который будет записана откомпилированная сборка. Директива ".assembly extern" указывает, что мы будем импортировать сборку mscorlib, в которой находится основная часть библиотеки классов .NET. В фигурных скобках после имени сборки могут перечисляться свойства сборки, но в простейшем случае их можно оставить пустыми.

Типы

Объявление типа осуществляется с помощью директивы ".class" и состоит из четырех частей:

  1. последовательность атрибутов типа;
  2. имя типа;
  3. базовый тип;
  4. список реализуемых интерфейсов.

Последовательность атрибутов следует непосредственно после ключевого слова ".class". В таблице 3.51 приведен набор наиболее часто используемых атрибутов.

Таблица 3.51. Атрибуты типов
Атрибут Описание
abstract Тип является абстрактным классом
interface Тип является интерфейсом
private Тип не экспортируется из сборки
public Тип экспортируется из сборки
sealed Тип не может являться базовым классом для другого типа (от него нельзя наследовать)
serializable Экземпляры типа могут быть сериализованы

После атрибутов следует идентификатор, задающий имя объявляемого типа.

Если объявляемый тип наследует от какого-нибудь другого типа (базового класса), отличного от System.Object, то необходимо указать имя базового класса после ключевого слова "extends". При этом, если в качестве базового класса выбран System.ValueType, то объявляемый тип будет типом-значением.

Если объявляемый тип реализует методы каких-либо интерфейсов, то должен быть приведен список этих интерфейсов после ключевого слова "implements".

Рассмотрим несколько примеров:

  1. Объявление экспортируемого абстрактного класса, реализующего интерфейс IEnumerable.
    .class public abstract MyAbstractClass
    extends [mscorlib]System.Object
    implements [mscorlib]System.Collections.IEnumerable
    { }
  2. Объявление неэкспортируемого интерфейса.
    .class private interface MyInterface { }
  3. Объявление экспортируемого типа-значения.
    .class public sealed MyValueType
      extends [mscorlib]System.ValueType
      { }

Обратите внимание, что перед именами библиотечных классов и интерфейсов в квадратных скобках указывается имя сборки, в которой они содержатся.

Поля

Поля объявляются внутри объявлений типов. Объявление поля осуществляется с помощью директивы ".field" и состоит из трех частей:

  1. последовательность атрибутов поля;
  2. тип;
  3. имя поля.

Последовательность атрибутов следует непосредственно после ключевого слова ".field". В таблице 3.52 приведен набор наиболее часто используемых атрибутов.

Таблица 3.52. Атрибуты полей
Атрибут Описание
assembly Поле видимо внутри сборки
family Поле видимо для наследников типа
public Поле видимо для всех
private Поле видимо только внутри типа
static Поле является статическим

После атрибутов следует тип поля и идентификатор, задающий имя поля.

Рассмотрим несколько примеров:

  1. Объявление поля x типа массив.
    .field private int32[] x
  2. Объявление поля table типа Hashtable.
    .field public class
    [mscorlib]System.Collections.Hashtable table
Методы

Методы объявляются внутри объявлений типов. Объявление метода осуществляется с помощью директивы ".method" и состоит из пяти частей:

  1. последовательность атрибутов метода;
  2. тип возвращаемого значения;
  3. имя метода;
  4. список параметров метода;
  5. тело метода.

Последовательность атрибутов следует непосредственно после ключевого слова ".method". В таблице 3.53 приведен набор наиболее часто используемых атрибутов.

После атрибутов следует тип возвращаемого значения и идентификатор, задающий имя метода. Если метод не возвращает значения, в качестве типа возвращаемого значения указывается void. Конструкторы всегда имеют имя ".ctor", а статические конструкторы - ".cctor".

Таблица 3.53. Атрибуты методов
Атрибут Описание
assembly Метод видим внутри сборки
family Метод видим для наследников типа
public Метод видим для всех
private Метод видим только внутри типа
abstract Метод является абстрактным
virtual Метод является виртуальным
final Метод не может переопределяться в наследниках
static Метод является статическим

Список параметров метода следует за именем метода и заключается в круглые скобки. Для каждого параметра указывается его тип и имя.

Прежде чем перейти к рассмотрению синтаксиса объявлений тел методов, приведем несколько примеров заголовков методов:

  1. Объявление конструктора с двумя параметрами.
    .method public void .ctor
      (int32 x, class [mscorlib]System.String s)
  2. Виртуальный метод с управляемым указателем в качестве параметра.
    .method private virtual int32 myMethod(int32& pX)
  3. Статический метод, возвращающий массив:
    .method public static int32[] MyStaticMethod()

Тело метода заключается в фигурные скобки и содержит инструкции языка CIL. Каждая инструкция записывается на новой строке программы. Если нужно, то инструкции может предшествовать метка, отделяемая от инструкции двоеточием. Например:

Hello:	ldstr "Hello, World!"
  	call void [mscorlib]System.Console.WriteLine(string)

Кроме инструкций CIL тело метода может содержать директивы тела метода. Они перечислены в таблице 3.54.

Таблица 3.54. Директивы тела метода
Директива Описание
.entrypoint Показывает, что данный метод является точкой входа в сборку (метод должен быть статическим, возвращать int32 или ничего не возвращать, иметь в качестве параметров массив строк или вообще не иметь параметров)
.locals (объявления) Определяет набор локальных переменных метода. Локальные переменные объявляются аналогично параметрам метода
.maxstack число Задает глубину стека вычислений
< Лекция 6 || Лекция 7: 123456 || Лекция 8 >
Анастасия Булинкова
Анастасия Булинкова
Рабочим названием платформы .NET было
Bogdan Drumov
Bogdan Drumov
Молдова, Республика
Azamat Nurmanbetov
Azamat Nurmanbetov
Киргизия, Bishkek