Составители:
Рубрика:
нейшем, генерация метаданных даже для такого несложного примера тре-
бует больших усилий. Сборку .NET, соответствующую нашему примеру,
можно получить, если откомпилировать следующую программу, записан-
ную в синтаксисе ассемблера ILASM:
.assembly HelloWorld
{
.hash algorithm 0x00008004
.ver 1:0:1:1
}
.module HelloWorld.exe
// hello() – единственный метод в нашей сборке
.method public static void hello() cil managed
{
.entrypoint
.maxstack 8
// Загружаем строку “Hello, World!” на стек
ldstr “Hello, World!”
// Выводим строку на экран
call void [mscorlib]System.Console::WriteLine(string)
// Ожидаем, пока пользователь введет строку
call string [mscorlib]System.Console::ReadLine()
// Выводим введенную строку на экран
call void [mscorlib]System.Console::WriteLine(string)
// Завершаем выполнение
ret
}
2.2.1. Расположение метаданных и кода внутри сборки
В предыдущем разделе данной главы мы рассмотрели формат испол-
няемых файлов .NET и выяснили, что он дает разработчику достаточно
большую свободу для размещения отдельных элементов внутри исполня-
емого файла. В частности, исполняемые файлы могут содержать несколь-
ко секций, и расположение этих секций, а также данных внутри них явля-
ется более или менее произвольным.
Давайте выберем для нашего учебного примера схему размещения
данных внутри исполняемого файла, изображенную на рисунке 2.7. Мы
будем использовать две секции: секция «.text» будет содержать всю основ-
ную информацию, а в секции «.reloc» будет размещена таблица релокаций.
Структура программных компонентов
65
0x00, 0x00, 0x0A, 0x28, 0x01, 0x00, 0x00, 0x0A,
0x28, 0x02, 0x00, 0x00, 0x0A, 0x2A
};
2.1.6.6. Пример работы программы
Итак, попробуем запустить нашу программу, набрав в консоли
pegen.exe (так будет называться наша программа):
C:\>Pegen.exe
Если все прошло успешно, то на экране мы увидим сообщение об ус-
пешной генерации сборки hello.exe:
File: hello.exe generated
Запустим сгенерированную сборку:
C:\>hello.exe
Программа распечатает на экране строку «Hello» и попросит ввести
произвольный текст. Введем, например, строку:
Hello Programm
В результате программа распечатает на экране строку, введенную ра-
нее, и закончит свою работу:
Hello Programm
2.2. Формат метаданных
Метаданные служат для описания типов, находящихся в сборке
.NET, и хранятся в исполняемых файлах. Для хранения метаданных ис-
пользуется достаточно сложный двоичный формат, изложение которого
заняло бы слишком много времени, поэтому в этом разделе мы ограни-
чимся лишь частичным и в большой степени поверхностным описанием
формата метаданных.
Если поставить себе цель в двух словах охарактеризовать формат мета-
данных в сборках .NET, то можно сказать следующее: он был бы значитель-
но проще, если бы его разработчики не уделяли чрезмерного внимания во-
просу компактности хранения метаданных. Дело в том, что спецификация
формата определяет по нескольку способов кодирования одной и той же
информации, описывает способы сжатия отдельных элементов метаданных
(например, сигнатур методов) и, тем самым, оказывается загроможденной
множеством деталей, затрудняющим разработку метаинструментов.
Для того чтобы провести обзор формата метаданных в этом разделе,
мы используем следующий прием: рассмотрим только те детали формата,
которые используются в незатейливом примере, выводящем на экран над-
пись «Hello, World!», а затем ожидающим ввода данных с клавиатуры. Мо-
жет показаться, что пример слишком прост, однако, как мы увидим в даль-
64
CIL и системное программирование в Microsoft .NET
64 CIL и системное программирование в Microsoft .NET Структура программных компонентов 65 0x00, 0x00, 0x0A, 0x28, 0x01, 0x00, 0x00, 0x0A, нейшем, генерация метаданных даже для такого несложного примера тре- 0x28, 0x02, 0x00, 0x00, 0x0A, 0x2A бует больших усилий. Сборку .NET, соответствующую нашему примеру, }; можно получить, если откомпилировать следующую программу, записан- ную в синтаксисе ассемблера ILASM: 2.1.6.6. Пример работы программы .assembly HelloWorld Итак, попробуем запустить нашу программу, набрав в консоли { pegen.exe (так будет называться наша программа): .hash algorithm 0x00008004 C:\>Pegen.exe .ver 1:0:1:1 Если все прошло успешно, то на экране мы увидим сообщение об ус- } пешной генерации сборки hello.exe: .module HelloWorld.exe File: hello.exe generated // hello() – единственный метод в нашей сборке Запустим сгенерированную сборку: .method public static void hello() cil managed C:\>hello.exe { Программа распечатает на экране строку «Hello» и попросит ввести .entrypoint произвольный текст. Введем, например, строку: .maxstack 8 Hello Programm // Загружаем строку “Hello, World!” на стек В результате программа распечатает на экране строку, введенную ра- ldstr “Hello, World!” нее, и закончит свою работу: Hello Programm // Выводим строку на экран call void [mscorlib]System.Console::WriteLine(string) 2.2. Формат метаданных // Ожидаем, пока пользователь введет строку call string [mscorlib]System.Console::ReadLine() Метаданные служат для описания типов, находящихся в сборке .NET, и хранятся в исполняемых файлах. Для хранения метаданных ис- // Выводим введенную строку на экран пользуется достаточно сложный двоичный формат, изложение которого call void [mscorlib]System.Console::WriteLine(string) заняло бы слишком много времени, поэтому в этом разделе мы ограни- чимся лишь частичным и в большой степени поверхностным описанием // Завершаем выполнение формата метаданных. ret Если поставить себе цель в двух словах охарактеризовать формат мета- } данных в сборках .NET, то можно сказать следующее: он был бы значитель- но проще, если бы его разработчики не уделяли чрезмерного внимания во- 2.2.1. Расположение метаданных и кода внутри сборки просу компактности хранения метаданных. Дело в том, что спецификация В предыдущем разделе данной главы мы рассмотрели формат испол- формата определяет по нескольку способов кодирования одной и той же няемых файлов .NET и выяснили, что он дает разработчику достаточно информации, описывает способы сжатия отдельных элементов метаданных большую свободу для размещения отдельных элементов внутри исполня- (например, сигнатур методов) и, тем самым, оказывается загроможденной емого файла. В частности, исполняемые файлы могут содержать несколь- множеством деталей, затрудняющим разработку метаинструментов. ко секций, и расположение этих секций, а также данных внутри них явля- Для того чтобы провести обзор формата метаданных в этом разделе, ется более или менее произвольным. мы используем следующий прием: рассмотрим только те детали формата, Давайте выберем для нашего учебного примера схему размещения которые используются в незатейливом примере, выводящем на экран над- данных внутри исполняемого файла, изображенную на рисунке 2.7. Мы пись «Hello, World!», а затем ожидающим ввода данных с клавиатуры. Мо- будем использовать две секции: секция «.text» будет содержать всю основ- жет показаться, что пример слишком прост, однако, как мы увидим в даль- ную информацию, а в секции «.reloc» будет размещена таблица релокаций.
Страницы
- « первая
- ‹ предыдущая
- …
- 37
- 38
- 39
- 40
- 41
- …
- следующая ›
- последняя »