Обратите внимание на то, что каждый из подклассов реализует TurboBoost() с помощью класса MessageBox, определенного в компоновочном блоке System. Windows.Forms.dll. Чтобы наш компоновочный блок мог использовать типы, определенные в рамках этого внешнего компоновочного блока, для проекта CarLibrary нужно указать ссылку на соответствующий двоичный файл в диалоговом окне Add Reference (Добавление ссылки), доступном в Visual Studio 2005 при выборе Project→Add Reference из меню (рис. 11.6).
Рис. 11.6. Здесь добавляются ссылки на внешние компоновочные блоки .NET
Очень
Замечание. Можно сделать так, чтобы пользовательские компоновочные блоки тоже появлялись в списке диалогового окна Add Reference, если установить их копии в папку C:\Program Files\Microsoft Visual Studio 8\Common7\lDE\PublicAssemblies, но большого смысла в этом нет. На вкладке Recent (Недавние ссылки) предлагается список компоновочных блоков, на которые вы недавно ссылались.
Анализ манифеста
Перед тем как использовать CarLibrary.dll в приложении-клиенте, давайте выясним, из чего скомпонована библиотека программного кода. Предположив, что наш проект уже скомпилирован, загрузим CarLibrary.dll в ildasm.exe (рис. 11.7).
Рис. 11.7. Библиотека CarLibrary.dll в окне ildasm.exe
Теперь откройте манифест файла CarLibrary.dll двойным щелчком на пиктограмме MANIFEST. В первом блоке программного кода манифеста указываются внешние компоновочные блоки, необходимые соответствующему компоновочному блоку для правильного функционирования. Как вы помните, CarLibrary.dll использует типы из mscorlib.dll и System.Windows.Forms.dll, и оба эти файла будут указаны в списке манифеста с помощью лексемы .assembly extern внешних связей компоновочного блока.
.assembly extern mscorlib {
.publickeytoken = (В7 7A 5C 56 19 34 E0 89)
.ver 2:0:0:0
}
.assembly extern System.Windows.Forms {
.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-кода