ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Шрифт:
Замечание. Можно сделать так, чтобы пользовательские компоновочные блоки тоже появлялись в списке диалогового окна 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 двойным щелчком на пиктограмме MANIFEST. В первом блоке программного кода манифеста указываются внешние компоновочные блоки, необходимые соответствующему компоновочному блоку для правильного функционирования. Как вы помните, CarLibrary.dll использует типы из mscorlib.dll и System.Windows.Forms.dll, и оба эти файла будут указаны в списке манифеста с помощью лексемы .assembly extern внешних связей компоновочного блока.
Здесь каждый блок .assembly extern снабжен директивами .publickeytoken и .ver. Инструкция .publickeytoken указывается только тогда, когда компоновочный блок имеет строгую форму имени (подробности будут приведены в этой главе позже). Лексема.ver обозначает (конечно же) числовой идентификатор версии.
После списка каталогизации внешних ссылок вы обнаружите ряд лексем.custom, идентифицирующих атрибуты уровня компоновочного блока. Проверив файл AssemblyInfо.cs, созданный в Visual Studio 2005, вы обнаружите, что эти атрибуты представляют такую информацию о компоновочном блоке, как название компании, торговая марка и т.д. (все соответствующие поля в данный момент пусты). В главе 14 атрибуты будут рассматриваться подробно, поэтому пока что не обращайте на них большого внимания. Однако следует знать, что атрибуты из AssemblyInfo.cs добавляют в манифест ряд лексем .custom, например, [AssemblyTitle].
Наконец, вы можете заметить, что лексема .assembly используется для обозначения понятного имени компоновочного блока (CarLibrary), в то время как лексема .module указывает имя самого модуля (CarLibrary.dll). Лексема .ver определяет номер версии, назначенный для компоновочного блока в соответствии с атрибутом [AssemblyVersion] из AssemblyInfo.cs. Подробнее об управлении версиями компоновочного блока будет говориться в этой главе позже, а сейчас необходимо заметить, что групповой символ * в атрибуте [AssemblyVersion] информирует Visual Studio 2005 о необходимости в процессе компиляции выполнить приращение для идентификатора версии в отношении номеров компоновки и варианта.
Анализ CIL-кода
Напомним, что компоновочный блок не содержит специфических для платформы инструкций, а содержит независимый от платформы CIL-код. Когда среда выполнения .NET загружает компоновочный блок в память, этот CIL-код компилируется (с помощью JIT-компилятора)
в инструкции, понятные для данной платформы. Если выполнить двойной щелчок на строке метода TurboBoost класса SportsCar, с помощью ildasm.exe откроется новое окно, в котором будут показаны CIL-инструкции.Обратите внимание на то, что для идентификации метода, определенного типом SportsCar, используется лексема .method. Члены-переменные, определенные типом, обозначаются лексемой .field. Напомним, что класс Car определяет набор защищенных данных, например, таких как currSpeed.
Свойства обозначены лексемой.property. Этот CIL-код описывает открытое свойство CurrSpeed (заметьте, что характеристики read/write свойства обозначаются лексемами .get и .set).
Анализ метаданных типов
Наконец, если вы сейчас нажмете комбинацию клавиш ‹Ctrl+M›, ildasm.exe отобразит метаданные для каждого из типов, имеющихся в компоновочном блоке CarLibrary.dll (рис. 11.8).
Рис. 11.8. Метаданные для типов на CarLibrary.dll
Теперь, после того как мы с вами заглянули внутрь компоновочного блока CarLibrary.dll, мы можем приступить в построению приложений клиента.
Исходный код. Проект CarLibrary размещен в подкаталоге, соответствующем главе 11.
Создание приложения-клиента в C#
Ввиду тот, что все типы CarLibrary были объявлены с ключевым словом public, другие компоновочные блоки способны их использовать. Напомним, что вы можете также объявлять типы с использованием ключевого слова C# internal (именно этот режим доступа в C# используется до умолчанию, когда вы определяете тип без указания public). Внутренние типы могут использоваться только тем компоновочным блоком, в котором они определены. Внешние клиенты не могут ни видеть, ни создавать внутренние типы компоновочных блоков.
Замечание. Сегодня .NET 2.0 предлагает возможность указать "дружелюбные" компоновочное блоки, которые позволяют использовать свои внутренние типы заданным компоновочным блокам. Подробности можно найти в разделе документации .NET Framework 2.0 SDK с описанием класса InternalsVisibleToAttribute.
Для использования открытых типов CarLibrary создайте новый проект консольного приложения C# (CSharpCarClient). После этого добавьте ссылку на Carbibrary.dll на вкладке Browse диалогового окна Add Reference (если вы скомпилировали CarLibrary.dll в Visual Studio 2005, ваш компоновочный блок будет размещен в подкаталоге \Bin\Debug папки проекта CarLibrary). После щелчка на кнопке ОК Visual Studio 2005 поместит копию CarLibrary.dll в папку \Bin\Debug папки проекта CSharpCarClient (рис. 11.9).