Как видите, ildasm.exe отображает метаданные .NET-типа очень подробно (двоичный формат оказывается гораздо более компактным). Если бы здесь потребовалось привести описание метаданных компоновочного блока CarLibrary.dll целиком, оно бы заняло несколько страниц. Это было бы лишней тратой вашего времени (и бумаги тоже), так что давайте рассмотрим метаданные только ключевых типов из компоновочного блока CarLibrary.dll.
Анализ метаданных перечня EngineState
Каждый тип, определенный в компоновочном блоке, обозначен маркером "TypeDef #n" (где TypeDef – это сокращение от
В случае CarLibrary.dll одно из описаний TypeDef в метаданных соответствуeт перечню CarLibrary.EngineState (у вac номер TypeDef может быть другим: нумерация TypeDef соответствует порядку, в котором компилятор C# обрабатывает соответствующие типы).
TypeDef #1
-------------------------------------------------------------
TypDefName: CarLibrary.EngineState (020000002)
Flags: [Public] [AutoLayout] [Class] [Sealed] [AnsiClass] (00000101)
Extends: 01000001 [TypeRef] System.Enum
…
Field #2
-------------------------------------------------------------
Field Маше: engineAlive (04000002)
Flags: [Public] [Static] [Literal] [HasDefault] (00008056)
DefltValue: (I4) 0
CallCnvntn: [FIELD]
Field type: ValueClass CarLibrary.EngineState
…
Метка TypDefName используется для имени типа. Метка метаданных Extends используется для указания базового класса данного типа .NET (в данном случае это тип System.Enum, обозначенный как TypeRef). Каждое поле перечня обозначено меткой "Field #n". Для примера здесь представлены только метаданные поля EngineState.engineAlive.
Анализ метаданных типа Car
Вот часть дампа типа Car, которая иллюстрирует следующее:
• способ определения полей
• представление методов в метаданных .NET;
• отображение свойства типа в пару специальных членов-функций.
TypeDef #3
-------------------------------------------------------------
TypDefName: CarLibrary.Car (02000004)
Flags: [Public] [AutoLayout] [Class] [Abstract] [AnsiClass] (00100081)
Extends: 01000002 [TypeRef] System.Object
Field #1
-------------------------------------------------------------
Field Name: petName (04000008)
Flags: [Family] (00000004)
CallCnvntn: [FIELD]
Field type: String
…
Method #1
-------------------------------------------------------------
MethodName:.ctor (06000001)
Flags: [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor] (00001886)
RVA: 0x00002050
ImplFlags: [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
…
Property #1
-------------------------------------------------------------
Prop.Name: PetName (17000001)
Flags: [none] (00000000)
CallCnvntn: [PROPERTY]
hasThis
ReturnType: String
No arguments.
DefltValue:
Setter: (06000004) set_PetName
Getter: (06000003) get_PetName
0 Others
…