Составители:
Рубрика:
Если некоторый бит установлен, это означает, что соответству-
ющая куча адресуется 32-разрядными индексами. В противном
случае куча адресуется 16-разрядными индексами.
char Valid[8];
Размер этого поля – 64 бита. При этом каждый бит соответствует
одной таблице метаданных. Если некоторый бит установлен, зна-
чит, соответствующая ему таблица присутствует в метаданных.
unsigned long Rows[7];
Массив 32-разрядных целых чисел, содержащих количество за-
писей в каждой из присутствующих таблиц метаданных. В на-
шем учебном примере этот массив имеет размер 7, так как мы
используем семь таблиц.
На рис. 2.10 представлено распределение элементов метаданных, ис-
пользуемых в учебном примере, по таблицам метаданных. При этом каж-
дая таблица имеет порядковый номер, который соответствует номеру опи-
сывающего ее бита в массиве Valid.
Давайте подробнее рассмотрим каждую из семи используемых в при-
мере таблиц метаданных.
2.2.3.1. Таблица сборок (Assembly – 0x20)
В этой таблице содержится только одна запись, описывающая нашу
сборку. В этой записи для нас интерес представляют следующие поля:
Структура программных компонентов
69
char Name[x];
ASCIIZ-строка, содержащая имя потока метаданных. Это поле
имеет переменную длину.
В спецификации CLI определено пять видов потоков метаданных.
Четыре потока метаданных представляют собой так называемые кучи, то
есть хранилища однородных объектов, таких как строки и GUID'ы, и один
поток метаданных имеет реляционную структуру и содержит таблицы ме-
таданных. В таблице 2.2 приведено описание каждого из пяти потоков.
Таблица 2.2. Потоки метаданных
2.2.3. Таблицы метаданных
В спецификации CLI определены несколько десятков видов таблиц
метаданных. Мы ограничимся рассмотрением только тех из них, которые
используются в нашем учебном примере.
На рис. 2.9 представлена структура потока таблиц метаданных для
учебного примера. Поток таблиц начинается с заголовка таблиц, непо-
средственно после которого следуют сами таблицы.
Заголовок таблиц метаданных содержит большое количество полей,
из которых нас интересуют в первую очередь три поля:
char HeapSizes;
Различные биты этого поля задают размеры индексов, исполь-
зуемых для адресации куч метаданных. Бит 0 соответствует куче
строк, бит 1 – куче GUID'ов, бит 3 – куче двоичных данных.
68
CIL и системное программирование в Microsoft .NET
Поток Имя потока Описание
Куча GUID'ов “#GUID” Представляет собой
последовательность 128-битных
глобальных уникальных
идентификаторов
Куча пользовательских ”#US” Содержит строковые константы,
строк определенные в программе
Куча строк “#Strings” Содержит названия элементов
метаданных (типов, методов,
полей и т.п.)
Куча двоичных данных “#Blob” Содержит двоичные данные,
описывающие метаданные
(например, сигнатуры методов)
Таблицы метаданных ”#~” Содержит физическое
представление таблиц метаданных
AssemblyRef Table – 0x23
Assembly Table – 0x20
ModuleRef Table – 0x0A
Method Table – 0x06
TypeDef Table – 0x02
TypeRef Table 0x01
Module Table – 0x00
Заголовок таблиц
struct MetadataTables
{
...
long HeapSizes;
...
char Valid[8];
...
unsigned long
Rows[7];
}
01000111 0000100 00000000 00000000 00000011 00000000 00000000 00000000
Рис. 2.9. Структура потока таблиц метаданных
0816 2432404856
68 CIL и системное программирование в Microsoft .NET Структура программных компонентов 69 char Name[x]; ASCIIZ-строка, содержащая имя потока метаданных. Это поле AssemblyRef Table – 0x23 имеет переменную длину. В спецификации CLI определено пять видов потоков метаданных. Assembly Table – 0x20 Четыре потока метаданных представляют собой так называемые кучи, то ModuleRef Table – 0x0A есть хранилища однородных объектов, таких как строки и GUID'ы, и один поток метаданных имеет реляционную структуру и содержит таблицы ме- Method Table – 0x06 struct MetadataTables таданных. В таблице 2.2 приведено описание каждого из пяти потоков. { TypeDef Table – 0x02 ... Таблица 2.2. Потоки метаданных TypeRef Table 0x01 long HeapSizes; ... Поток Имя потока Описание Module Table – 0x00 char Valid[8]; ... Куча GUID'ов “#GUID” Представляет собой unsigned long последовательность 128-битных Заголовок таблиц Rows[7]; глобальных уникальных } идентификаторов Куча пользовательских ”#US” Содержит строковые константы, 01000111 0000100 00000000 00000000 00000011 00000000 00000000 00000000 строк определенные в программе 0 8 16 24 32 40 48 56 Куча строк “#Strings” Содержит названия элементов Рис. 2.9. Структура потока таблиц метаданных метаданных (типов, методов, Если некоторый бит установлен, это означает, что соответству- полей и т.п.) ющая куча адресуется 32-разрядными индексами. В противном Куча двоичных данных “#Blob” Содержит двоичные данные, случае куча адресуется 16-разрядными индексами. описывающие метаданные char Valid[8]; (например, сигнатуры методов) Размер этого поля – 64 бита. При этом каждый бит соответствует Таблицы метаданных ”#~” Содержит физическое одной таблице метаданных. Если некоторый бит установлен, зна- представление таблиц метаданных чит, соответствующая ему таблица присутствует в метаданных. unsigned long Rows[7]; Массив 32-разрядных целых чисел, содержащих количество за- 2.2.3. Таблицы метаданных писей в каждой из присутствующих таблиц метаданных. В на- В спецификации CLI определены несколько десятков видов таблиц шем учебном примере этот массив имеет размер 7, так как мы метаданных. Мы ограничимся рассмотрением только тех из них, которые используем семь таблиц. используются в нашем учебном примере. На рис. 2.10 представлено распределение элементов метаданных, ис- На рис. 2.9 представлена структура потока таблиц метаданных для пользуемых в учебном примере, по таблицам метаданных. При этом каж- учебного примера. Поток таблиц начинается с заголовка таблиц, непо- дая таблица имеет порядковый номер, который соответствует номеру опи- средственно после которого следуют сами таблицы. сывающего ее бита в массиве Valid. Заголовок таблиц метаданных содержит большое количество полей, Давайте подробнее рассмотрим каждую из семи используемых в при- из которых нас интересуют в первую очередь три поля: мере таблиц метаданных. char HeapSizes; Различные биты этого поля задают размеры индексов, исполь- 2.2.3.1. Таблица сборок (Assembly – 0x20) зуемых для адресации куч метаданных. Бит 0 соответствует куче В этой таблице содержится только одна запись, описывающая нашу строк, бит 1 – куче GUID'ов, бит 3 – куче двоичных данных. сборку. В этой записи для нас интерес представляют следующие поля:
Страницы
- « первая
- ‹ предыдущая
- …
- 39
- 40
- 41
- 42
- 43
- …
- следующая ›
- последняя »