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

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

Вы уже знаете, как использовать 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

 }

}

Во-первых, обратите внимание на то, что файл *.il начинается с объявления всех внешних компоновочных блоков, на которые ссылается данный компоновочный блок. Здесь вы видите только одну директиву .assembly extern для одного обязательно присутствующего mscorlib.dll. Если бы ваша библиотека классов использовала типы из других внешних компоновочных блоков, вы бы обнаружили дополнительные директивы .assembly extern.

Далее следует формальное определение вашего компоновочного блока HelloProgram.exe, для которого указана версия 0.0.0.0, назначаемая по умолчанию (если вы не укажете иное значение с помощью атрибута [AssemblyVersion]). После этого приводятся другие описания компоновочного блока, для которых используются другие директивы CIL (такие, как .module, .imagebase и т.д.).

После указания ссылок на внешние компоновочные блоки и определения текущего компоновочного блока идет определение типа Program. Обратите внимание на то, что директива.class имеет несколько атрибутов (многие из которых необязательны), – например, атрибут extends, задающий базовый класс типа.

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

Большой кусок программного кода CIL соответствует конструктору класса, заданному по умолчанию, и методу Main(). Оба они определены (в частности) с помощью директивы .method. После определения этих членов с помощью подходящих директив и атрибутов они реализуются с помощью различных кодов операций.

Важно понять, что в CIL при взаимодействии с типами .NET (например, с System.Console) всегда необходимо использовать абсолютные имена типов. Более того, к абсолютному имени типа всегда должен добавляться (в квадратных скобках) префикс с понятным именем компоновочного блока, определяющего этот тип. Взгляните на CIL-реализацию Main().

.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

}

Реализация конструктора, заданного по умолчанию, в терминах программного кода CIL включает еще одну относящуюся к загрузке инструкцию (ldarg.0). В данном случае значение загружается в стек не как пользовательская переменная, указанная нами, а как текущая объектная ссылка (подробности этого процесса будут описаны позже). Также обратите внимание на то, что конструктор, заданный по умолчанию, явно вызывает конструктор базового класса.

.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

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Технология не нейтральна

Из книги Все под контролем: Кто и как следит за тобой автора Гарфинкель Симеон

Технология не нейтральна Однажды на конференции я встретил студента MTI. Со всей искренностью он заявил мне, что технология нейтральна по отношению к приватности. «Технологии могут использоваться для нарушения приватности, либо они могут использоваться для защиты


7.3.6. Технология и CMM

Из книги Модель зрелости процессов разработки программного обеспечения автора Паулк Марк

7.3.6. Технология и CMM Ключевые практики не ограничивают и не требуют применения конкретных технологий разработки ПО, таких как создание прототипов, объектно-ориентированное проектирование, или повторное использование требований к ПО, его архитектуры, кода или других


6.4.1. Технология Bluetooth

Из книги Fedora 8 Руководство пользователя автора Колисниченко Денис Николаевич

6.4.1. Технология Bluetooth Название технологии Bluetooth переводится немного смешно - "голубой зуб". Но это так, к слову. А вообще данная технология используется для передачи данных через радиоканал на час-тюте 2,45 ГГц. Разработчиками данной технологии являются компании Ericsson, IBM, Intel,


Технология ССК

Из книги Домашние и офисные сети под Vista и XP автора Ватаманюк Александр Иванович

Технология ССК Технология кодирования с использованием комплементарных кодов (Complementary Code Keying, ССК) применяется для кодирования битов данных с целью их сжатия, что позволяет достичь повышения скорости передачи данных.Изначально данная технология начала использоваться в


2.3.2 Технология и компоненты EDA/SQL

Из книги Руководство администратора баз данных Informix. автора Кустов Виктор

2.3.2 Технология и компоненты EDA/SQL Технология EDA/SQL фирмы Information Builders, Inc. позволяет осуществлять доступ средствами SQL не только к реляционным, но и к нереляционным источникам данных, таким как иерархические базы данных и файлы с определенной структурой записей (record-oriented files),


Технология PowerPC

Из книги Основы AS/400 автора Солтис Фрэнк

Технология PowerPC «По сути своей, IBM s компания технологий», — сказал Лу Герстнер (Lou Gerstner) вскоре после того, как возглавил корпорацию в 1993 году. И действительно, чуть ли не все основные технологии компьютерной индустрии s от RISC до реляционных баз данных s вышли из IBM. В прошлом


Технология PowerPC для AS/400

Из книги Создание шаблонов Joomla автора Автор неизвестен

Технология PowerPC для AS/400 Президентом IBM в 1991 году был Джек Кюлер (Jack Kuehler). Он привел IBM к соглашению с Apple и Motorola о создании микропроцессоров PowerPC. Джек Кюлер считал, что к концу десятилетия все компьютеры, от самых маленьких, умещающихся на ладони, до суперЭВМ будут


Технология

Из книги Серверные технологии хранения данных в среде Windows® 2000 Windows® Server 2003 автора Дайлип Наик

Технология Joomla! до версии 1.5.0 все еще использует разметку в виде XHTML таблиц. Однако, при построении сайта со «свободной» конфигурацией элементов использование тегов таблиц недопустимо. Таким образом, программный код Joomla!, отвечающий за вывод информации необходимо


8.1 Технология IP Storage

Из книги Технологии программирования автора Камаев В А

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


6.6. СОМ — ТЕХНОЛОГИЯ РАЗРАБОТКИ РАЗВИВАЮЩИХСЯ И РАССРЕДОТОЧЕННЫХ КОМПЛЕКСОВ ПРОГРАММ

Из книги Тайм-менеджмент для системных администраторов автора Лимончелли Томас

6.6. СОМ — ТЕХНОЛОГИЯ РАЗРАБОТКИ РАЗВИВАЮЩИХСЯ И РАССРЕДОТОЧЕННЫХ КОМПЛЕКСОВ ПРОГРАММ СОМ — Component Object Model (модель компонентных объектов) — это спецификация метода создания компонент и построения из них программ.В литературных источниках можно найти множество теорий и


Технология Wiki

Из книги Программирование КПК и смартфонов на .NET Compact Framework автора Климов Александр П.

Технология Wiki Чтобы создать веб-сайт (хранилище информации) с легко обновляемыми страницами, воспользуйтесь технологией Wiki. Строго говоря, Wiki — это концепция, а не конкретный программный пакет. Есть много программных пакетов, предлагающих пользователю функциональность


Технология Bluetooth

Из книги Удвоение продаж в интернет-магазине автора Парабеллум Андрей Алексеевич

Технология Bluetooth Несмотря на свою дешевизну и простоту, инфракрасное соединение имеет несколько существенных недостатков. К ним относятся маленький радиус действия и возможность связи в пределах прямой видимости. Этих недостатков лишено Bluetooth-соединение.Но и тут не


Технология допродаж

Из книги Delphi. Трюки и эффекты автора Чиртик Александр Анатольевич

Технология допродаж В чем суть? Начните предлагать клиентам к основной покупке что-нибудь еще из своих товаров (услуг). В идеале, если вы будете делать это с дополнительными скидками и бонусами, немалый процент людей обязательно купят предложенное.Есть два основных


9.1. Технология OLE

Из книги Интернет-маркетинг. Полный сборник практических инструментов автора Вирин Федор Юрьевич

9.1. Технология OLE В Windows 3.1 и более ранних версиях основным средством обмена данными между программами была технология DDE – Dynamic Data Exchange (динамический обмен данными). На этой технологии основывалась технология OLE – Object Linking and Embedding (связывание и внедрение объектов). OLE


9.2. Технология СОМ

Из книги автора

9.2. Технология СОМ Модель СОМ построена по принципу архитектуры «клиент – сервер». Сервер предоставляет список возможных действий (функций), которые могут использоваться клиентским процессом. Таким образом, серверный процесс позволяет обрабатывать запросы клиента,