Замечание. В программном коде CIL поддерживаются комментарии, использующие синтаксис двойной косой черты (а также синтаксис /*…*/). Как и в C#, компилятором CIL комментарии просто игнорируются.

<p>Челночная технология разработки</p>

Вы уже знаете, как использовать ildasm.exe для просмотра программного кода CIL, генерируемого компилятором C#. Однако вы можете не знать о том, что ildasm.exe позволяет записать CIL-код, содержащийся в загруженном компоновочном блоке, во внешний файл. Имея программный код CIL в своем распоряжении, вы можете отредактировать и с помощью ildasm.exe – компилятора CIL – скомпилировать базовый код вновь.

Формально такой подход называется челночной технологией разработки, и эта технология может оказаться полезной в следующих случаях.

• Перед вами стоит задача изменить компоновочный блок, для которого нет исходного кода.

• Ввиду несовершенства компилятора языка .NET, сгенерировавшего неэффективный программный код CIL, вы хотите изменить этот код.

• Вы создаете компоновочные блоки, взаимодействующие в рамках COM, и вам приходится принимать во внимание то, что некоторые атрибуты IDL (Interface Definition Language – язык описания интерфейса) в процессе преобразования могут теряться (например, COM-атрибут [helpstring]).

Для примера использования челночной технологии разработки создайте новый файл (HelloProgram.cs) исходного кода C# с помощью обычного текстового редактора и определите в этом файле следующий тип класса (можете, конечно, использовать и Visual Studio 2005, но тогда не забудьте удалить файл AssemblyInfo.cs, чтобы уменьшить объем генерируемого CIL-кода).

// Простое консольное приложение на языке C#.

using System;

class Program {

 static void Main(string[] args) {

  Console.WriteLine("Hello CIL code!");

  Console.ReadLine;

 }

}

Сохраните этот файл в подходящем месте на своем диске и скомпилируйте его с помощью программы csc.exe.

csc HelloProgram.cs

Теперь откройте полученный файл HelloProgram.exe с помощью ildasm.exe и, используя опцию меню File->Dump, сохраните "сырой" программный код CIL в новом файле *.il (HelloProgram.il) На вашем жестком диске (значения, предлагаемые в появляющемся диалоговом окне, вполне подойдут для наших целей). Теперь вы можете рассмотреть этот файл, используя любой текстовый редактор. Вот слегка откорректированный в снабженный некоторыми комментариями результат.

// Компоновочные блоки, на которые мы ссылаемся.

.assembly extern mscorlib {

 .publickeytoken = (В7 7A 5С 56 19 34 Е0 89)

 .ver 2:0:0:0

}

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

.assembly HelloProgram {

 .hash algorithm 0х00008004

.ver 0:0:0:0

}

.module HelloProgram.exe

.imagebase 0x00400000

.file alignment 0x00000200

.stackreserve 0x00100000

.subsystem 0x0003

.corflags 0x00000001

// Определение класса Program.

.class private auto ansi beforefieldinit Program extends [mscorlib]System.Object {

 .method private hidebysig static void Main(string[] args) cil managed {

  // Обозначение этого метода, как точки входа

  // выполняемого файла.

  .entrypoint

  .maxstack.8

  IL_0000: nop

  IL_0001: ldstr "Hello CIL code!"

  IL_0006: call void [mscorlib]System.Console::WriteLine(string)

  IL_000b: nop

  IL_000c: call string [mscorlib]System.Console::ReadLine

  IL_0011: pop

  IL_0012: ret

 }

 // Конструктор, заданный по умолчанию.

 .method public hidebysig specialname rtspecialname instance void .ctor cil managed {

  .maxstack 8

  IL_0000: ldarg.0

  IL_0001: call instance void [mscorlib]System.Object::.ctor

  IL_0006: ret

 }

}

Перейти на страницу:

Похожие книги