Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Троелсен Э. Язык программирования С# 2010 и п...docx
Скачиваний:
113
Добавлен:
21.09.2019
Размер:
6.92 Mб
Скачать

Роль peverify.Exe

При создании или модификации компоновочных блоков, в которых используется программный код CIL, всегда целесообразно проверить, будет ли скомпилированный двоичный образ правильно сформирован с точки зрения правил .NET. Для этого можно использовать средство командной строки peverify.exe.

peverifу HelloProgram.exe

Этот инструмент проверит все коды операций в указанном компоновочном блоке на соответствие правилам CIL. Например, в терминах CIL-кода стек оценок должен всегда опустошаться: перед выходом из функции, Если вы забудете извлечь из него какие-то значения, компилятор ilasm.exe все равно сгенерирует допустимый компоновочный блок (поскольку компиляторы "заботятся" только о синтаксисе).

А вот peverifу.exe, с другой стороны, заботится о семантике. Если вы забудете очистить стек перед выходом из функции, peverify.exe сообщит вам об этом.

Исходный код. Файл HelloProgram.il размещен в подкаталоге, соответствующем главе 15.

Директивы и атрибуты cil

Теперь, когда вы знаете, как использовать ildasm.exe и ilasm.exe в рамках челночной технологии разработки, мы можем заняться непосредственным анализом синтаксиса и семантики CIL. Следующие разделы предлагают описание процесса построения пользовательского пространства имен, содержащего определенный набор типов. Чтобы упростить рассмотрение, эти типы не будут содержать никакого программного кода реализации их членов. После того как вы поймете, как создаются пустые типы, вы сможете сосредоточить все свое внимание на процессе создания "реальных" членов типа с помощью кодов операций CIL.

Ссылки на внешние компоновочные блоки

С помощью любого редактора создайте новый файл, назвав его 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 (заметьте, что все числовые идентификаторы в определении должны разделяться двоеточием, не точкой, как в C#).

// Наш компоновочный блок.

.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 означает консольное приложение