ПриМеЧание
На.самом.деле.в.таблицах.метаданных.манифеста.не.описаны.типы,.экспортируемые.
PE-файлом,.в.котором.находится.манифест .Цель.этой.оптимизации.—.уменьшить.
число.байт,.необходимое.для.хранения.данных.манифеста.в.PE-файле .Таким.образом,.
утверждения.вроде.«таблицы.метаданных.манифеста.включают.все.открытые.типы,.
экспортируемые.MultiFileLibrary dll.и.RUT netmodule»,.верны.лишь.отчасти .Однако.
это.утверждение.вполне.точно.отражает.логический.набор.экспортируемых.типов
Построив сборку
MultiFileLibrary dll
, можно изучить ее таблицы метаданных ма-
нифеста при помощи
ILDasm exe
, чтобы убедиться, что файл сборки действительно
содержит ссылки на типы из файла
RUT netmodule
. Таблицы метаданных
FileDef
и
ExportedTypesDef
выглядят следующим образом:
File #1 (26000001)
Token: 0x26000001
Name : RUT.netmodule
HashValue Blob : e6 e6 df 62 2c a1 2c 59 97 65 0f 21 44 10 15 96 f2 7e db c2
Flags : [ContainsMetaData] (00000000)
ExportedType #1 (27000001)
Token: 0x27000001
Name: ARarelyUsedType
77
Объединение.модулей.для.создания.сборки
Implementation token: 0x26000001
TypeDef token: 0x02000002
Flags : [Public] [AutoLayout] [Class] [Sealed] [AnsiClass]
[BeforeFieldInit](00100101)
Из этих сведений видно, что
RUT netmodule
— это файл, который считается ча-
стью сборки с маркером
0x26000001
. Таблица
ExportedType
показывает наличие
открытого экспортируемого типа
ARarelyUsedType
. Этот тип помечен
маркером
реализации
(implementation token)
0x26000001
, означающим, что IL-код этого типа
находится в файле
RUT netmodule
.
рис. 2.1.
.Многофайловая.сборка.из.двух.управляемых.модулей.и.манифеста
ПриМеЧание
Для.любопытных:.размер.маркеров.метаданных.—.4.байта .Старший.байт.указывает.
тип.маркера.(0x01=TypeRef,.0x02=TypeDef,.0x26=FileRef,.0x27=ExportedType) .Пол-
ный.список.типов.маркеров.см .в.перечислимом.типе.CorTokenType.в.заголовочном.
файле.CorHdr h.из. NET.Framework.SDK .Три.младших.байта.маркера.просто.иден-
тифицируют.запись.в.соответствующей.таблице.метаданных .Например,.маркер.
реализации.0x26000001.ссылается.на.первую.строку.таблицы.FileRef.(в.большинстве.
таблиц.нумерация.строк.начинается.с.1,.а.не.с.0) .Кстати,.в.TypeDef.нумерация.строк.
начинается.с.2
Любой клиентский код, использующий типы сборки
MultiFileLibrary dll
, должен ком-
поноваться с указанием параметра компилятора
/r[eference]:MultiFileLibrary.
dll
, который заставляет компилятор загрузить сборку
MultiFileLibrary dll
и все файлы,
перечисленные в ее таблице
FileDef
. Компилятору необходимо, чтобы все файлы
сборки были установлены и доступны. Если удалить файл
RUT netmodule
, компи-
лятор C# выдаст следующее сообщение об ошибке:
78
Do'stlaringiz bilan baham: |