.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
.ver 2:0:0:0.
}
Здесь каждый блок .assembly extern снабжен директивами .publickeytoken и .ver. Инструкция .publickeytoken указывается только тогда, когда компоновочный блок имеет
После списка каталогизации внешних ссылок вы обнаружите ряд лексем.custom, идентифицирующих атрибуты уровня компоновочного блока. Проверив файл AssemblyInfо.cs, созданный в Visual Studio 2005, вы обнаружите, что эти атрибуты представляют такую информацию о компоновочном блоке, как название компании, торговая марка и т.д. (все соответствующие поля в данный момент пусты). В главе 14 атрибуты будут рассматриваться подробно, поэтому пока что не обращайте на них большого внимания. Однако следует знать, что атрибуты из AssemblyInfo.cs добавляют в манифест ряд лексем .custom, например, [AssemblyTitle].
.assembly CarLibrary {
…
.custom instance void [mscorlib]
System.Reflection.AssemblyTitleAttribute::.ctor(string) = (01 00 00 00 00)
.hash algorithm 0x00008004
.ver 1:0:454:30104
}
.module CarLibrary.dll
Наконец, вы можете заметить, что лексема .assembly используется для обозначения понятного имени компоновочного блока (CarLibrary), в то время как лексема .module указывает имя самого модуля (CarLibrary.dll). Лексема .ver определяет номер версии, назначенный для компоновочного блока в соответствии с атрибутом [AssemblyVersion] из AssemblyInfo.cs. Подробнее об управлении версиями компоновочного блока будет говориться в этой главе позже, а сейчас необходимо заметить, что групповой символ * в атрибуте [AssemblyVersion] информирует Visual Studio 2005 о необходимости в процессе компиляции выполнить приращение для идентификатора версии в отношении номеров компоновки и варианта.
Анализ CIL-кода
Напомним, что компоновочный блок не содержит специфических для платформы инструкций, а содержит независимый от платформы CIL-код. Когда среда выполнения .NET загружает компоновочный блок в память, этот CIL-код компилируется (с помощью JIT-компилятора) в инструкции, понятные для данной платформы. Если выполнить двойной щелчок на строке метода TurboBoost класса SportsCar, с помощью ildasm.exe откроется новое окно, в котором будут показаны CIL-инструкции.
.method public hidebysig virtual instance void TurboBoost cil managed {
// Code size 17 (0x11)
.maxstack 2
IL_0000: ldstr "Ramming speed!"
IL_0005: ldstr "Faster is better…"
IL_000a: call valuetype [System.Windows.Forms] System.Windows.Forms.DialogResult [System.Windows.Forms] System.Windows.Forms.MessageBox::Show(string, string)
IL_000f: pop
IL_0010: ret
} // end of method SportsCar::TurboBoost
Обратите внимание на то, что для идентификации метода, определенного типом SportsCar, используется лексема .method. Члены-переменные, определенные типом, обозначаются лексемой .field. Напомним, что класс Car определяет набор защищенных данных, например, таких как currSpeed.
.field family int 16 currSpeed
Свойства обозначены лексемой.property. Этот CIL-код описывает открытое свойство CurrSpeed (заметьте, что характеристики read/write свойства обозначаются лексемами .get и .set).
.property instance int16 CurrSpeed {
.get instance int16 CarLibrary.Car::get_CurrSpeed
.set instance void CarLibrary.Car::set_CurrSpeed(int16)
} // end of property Car::CurrSpeed
Анализ метаданных типов
Наконец, если вы сейчас нажмете комбинацию клавиш ‹Ctrl+M›, ildasm.exe отобразит метаданные для каждого из типов, имеющихся в компоновочном блоке CarLibrary.dll (рис. 11.8).
Рис. 11.8. Метаданные для типов на CarLibrary.dll
Теперь, после того как мы с вами заглянули внутрь компоновочного блока CarLibrary.dll, мы можем приступить в построению приложений клиента.
Исходный код. Проект CarLibrary размещен в подкаталоге, соответствующем главе 11.
Создание приложения-клиента в C#