Прежде всего, отметьте то, что метаданные класса Car указывают базовый класс типа и включают различные флаги, использовавшиеся конструктором типа при его создании (такие как [public], [abstract] и т.п.). Методы (например, конструктор класса Car) описаны с учетом их имени, параметров и возвращаемого значения. Наконец, обратите внимание на то, что свойства представляются внутренними методами get_ /set_ с использованием меток Setter/Getter метаданных .NET. Как и следует ожидать, производные типы Car (это SportsCar и MiniVan) описываются аналогично.

<p>Анализ TypeRef</p>

Напомним, что метаданные компоновочного блока описывают не только множество внутренних типов (Car, EngineState и т.д.), но и внешние типы, на которые ссылается данный компоновочный блок. Например, поскольку CarLibrary.dll Определяет два перечня, в описании присутствует блок TypeRef для типа System.Enum.

TypeRef #1 (01000001)

-------------------------------------------------------------

Token: 0x01000001

ResolutionScope: 0x23000001

TypeRefName: System.Enum

 MemberRef #1

 -------------------------------------------------------------

 Member: (0a00000f) ToString:

 CallCnvntn: [DEFAULT] hasThis

 ReturnType: String

 No arguments.

<p>Представление метаданных компоновочного блока</p>

Окно метаданных ildasm.exe позволяет также просмотреть метаданные самого компоновочного блока, для обозначения которых используется метка Assembly. Следующий фрагмент листинга показывает, что информация, представленная в таблице Assembly, аналогична информации, получаемой в окне ildasm.exe через пиктограмму MANIFEST (и это совсем не удивительно). Вот часть манифеста CarLibrary.dll (версии 2.0.0.0).

Assembly

-------------------------------------------------------------

 Token: 0x20000001

 Name: CarLibrary

 Public Key: 00 24 00 00 04 80 00 00 // и т.д.

 Hash Algorithm: 0x00008004

 Major Version: 0x00000002

 Minor Version: 0x00000000

 Build Number: 0x00000000

 Revision Number: 0x000000000

 Locale: ‹null›

 Flags: [SideBySideCompatible] (00000000)

<p>Представление ссылок на другие компоновочные блоки</p>

Вдобавок к метке Assembly и набору меток TypeDef и TypeRef метаданные .NET используют метки "AssemblyRef #n", чтобы обозначить внешние компоновочные блоки. Например, поскольку CarLibrary.dll использует тип MessageBox, в окне метаданных вы обнаружите метку AssemblyRef для System.Windows.Forms.

AssemblyRef #2

-------------------------------------------------------------

 Token: 0x23000002

 Public Key or Token: b7 7a 5c 56 19 34 e0 89

 Name: System.Windows.Forms

 Version: 2.0.3600.0

 Major Version: 0x00000002

 Minor Version: 0x00000000

 Build Number: 0x00000e10

 Revision Number: 0x00000000

 Locale: ‹null›

 HashValue Blob:

 Flags: [none] (00000000)

<p>Представление строковых литералов</p>

В заключение нашего обсуждения метаданных .NET укажем на то, что все строковые литералы базового программного кода представляются в окне метаданных ildasm.exe под знаком метки User Strings, как показано ниже[1].

User Strings

70000001: (11) L"Car 2.0.0.0"

70000019: (11) L"Jamming {0}"

70000031: (13) L"Quiet time…"

7000004d: (14) L"Ramming speed!"

7000006b: (19) L"Faster is better."

70000093: (16) L"Time to call AAA"

700000b5: (16) L"Your car is dead"

700000d7: (9) L"Be quiet "

700000eb: (2) L"!!"

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

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

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