С помощью любого редактора создайте новый файл, назвав его CilTypes.il. Сначала вы должны указать список внешних компоновочных блоков, используемых текущим компоновочным блоком (в нашем примере мы будем использовать только типы из mscorlib.dll). Для этого нужно указать директиву .assembly с атрибутом external. При ссылке на строго именованный компоновочный блок, такой как mscorlib.dll, вы должны также указать директивы .publickeytoken и .ver.
.assembly extern mscorlib {
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
.ver 2:0:0:0
}
Замечание. Строго говоря, явная ссылка на внешний компоновочный блок mscorlib.dll не является обязательной, поскольку ilasm.exe добавит такую ссылку автоматически.
Определение текущего компоновочного блока
Следующей задачей является определение компоновочного блока, который вы хотите построить. Это делается с помощью директивы .assembly. В простейшем случае компоновочный блок можно определить с помощью простого указания понятного имени соответствующего двоичного файла.
// Наш компоновочный блок.
.assembly CILTypes {}
Это действительно определяет новый компоновочный блок .NET, но обычно в рамках декларации компоновочного блока размещаются дополнительные директивы. Для нашего примера добавьте в определение компоновочного блока номер версии 1.0.0.0 с помощью директивы .ver (заметьте, что все числовые идентификаторы в определении должны разделяться
// Наш компоновочный блок.
.assembly CILTypes {
.ver 1:0:0:0
}
Поскольку компоновочный блок CILTypes является одномодульным компоновочным блоком, определение этого компоновочного блока завершается единственной директивой.module, которая указывает официальное имя двоичного .NET-файла, CILTypes.dll.
.assembly CILTypes {
.ver 1:0:0:0
}
// Этот модуль является одномодульным компоновочным блоком.
.module CILTypes.dll
Кроме директив .assembly и .module, есть и другие CIL-директивы, обеспечивающие дальнейшее уточнение структуры создаваемого двоичного файла .NET. В табл. 15.2 предлагаются описания еще двух директив уровня компоновочного блока,
Таблица 15.2. Дополнительные директивы компоновочного блока
| Директива | Описание |
|---|---|
| .mresources | Если компоновочный блок использует встраиваемый ресурс (например, точечный рисунок или таблицу строк), эта директива используется для идентификации имени файла, содержавшего такой ресурс. В главе 20 ресурсы .NET рассматриваются подробно |
| .subsystem | Эта директива CIL используется для указания предпочтительного пользовательского интерфейса для выполнения компоновочного блока, например, значение 2 означает, что компоновочный блок должен выполняться в рамках графического интерфейса с поддержкой форм, а значение 3 означает консольное приложение |
Определение пространств имен
Итак, вы определили вид своего компоновочного блока (и необходимые внешние ссылки). Теперь можно создать пространство имен .NET (МуNamespace), используя для этого директиву .namespace.
// Наш компоновочный блок имеет одно пространство имен.
.namespace MyNamespace {}
Как и в C#, определение пространства имен CIL можно вложить во внешнее пространство имен. Вот пример вложения нашего пространства имен в корневое пространство имен с именем IntertechTraining.
.namespace IntertechTraining {
.namespace MyNamespace {}
}
Кроме того, как и C#, язык CIL позволяет определить вложенное пространство имен так.
// Определение вложенного пространства имен.
.namespace IntertechTraining.MyNamespace{}
Определение типов класса