Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Троелсен Э. Язык программирования С# 2010 и п...docx
Скачиваний:
113
Добавлен:
21.09.2019
Размер:
6.92 Mб
Скачать

Анализ метаданных типа Car

Вот часть дампа типа Car, которая иллюстрирует следующее:

• способ определения полей в терминах метаданных .NET;

• представление методов в метаданных .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

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

Анализ TypeRef

Напомним, что метаданные компоновочного блока описывают не только множество внутренних типов (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.

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

Окно метаданных 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)