* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Разделяемые сборки
8 февраля 2009
Сборки могут быть закрытыми (private) или разделяемыми (shared). Закрытая сборка используется только одним приложением, а разделяемая — доступна нескольким приложениями.
Примечание В данном контексте семантика терминов «закрытый* и «разделяемый» («открытый») отличается от таковой модификаторов доступа Private (private) и Shared, применяемых для объявления типов и членов. Здесь эти термины указыва- ют, доступна ли некоторая сборка одному или нескольким приложениям. Закрытые и разделяемые сборки Большинство созданных вами сборок скорее всего будут закрытыми. Их проще со- здавать, к тому же по умолчанию создается именно этот тип сборок. Закрытая сбор- ка доступна только одному приложению и является его компонентом, размещается вместе с приложением и доступна только из него. В связи с этим закрытые сборки не поддерживают управление версиями и расширенные идентификационные данные. Изучая материалы этого курса, мы до сих пор создавали только закрытые сборки. Изучая элементы управления в главе 7, мы создавали сборки с нестандартными элементами управления, доступные из любых проектов, однако эти сборки являют- ся закрытыми. Нет ли тут несоответствия? Дело в том, что при добавлении в проект ссылки на закрытую сборку, Visual Studio .NET копирует DLL этой сборки в каталог проекта. Так, несколько проектов могут ссылаться на одну и туже DLL и вызывать содержащиеся в ней типы, но при этом у каждого такого проекта имеется своя копия этой DLL. В отличие от закрытых, разделяемые сборки существуют на компьютере в един- ственном экземпляре, который доступен нескольким приложениям. Чтобы сделать сборку разделяемой, необходимо установить ее в кэш глобальных сборок (Global Assembly Cache, GAC). Хранение сборок в GAC имеет ряд преимуществ: • централизованное хранение сборок — если некоторая сборка требуется несколь- ким приложениям, достаточно сделать ее разделяемой, чтобы решить проблему; • безопасность — GAC находится в каталоге C:\W1NNT (в Microsoft Windows 2000) или WINDOWS (в Microsoft Windows XP), который по умолчанию защищен са- мыми строгими мерами безопасности; • возможность использовать несколько версий сборки одновременно — в GAC мож- но устанавливать несколько версий одной и той же сборки. Каждое приложение определяет и загружает нужную ему версию. Как говорилось ранее, чаще всего создают закрытые сборки. Разделяемые сбор- ки требуются, если на то есть веские причины. Чтобы создать разделяемую сборку и установить ее в GAC, необходимо назначить сборке строгое имя. Строгое имя Строгое имя (strong name) гарантирует подлинность сборки. Оно включает иденти- фикационные данные сборки, такие, как ее имя, номер версии, сведения о культу- ре (если таковая назначена) и открытый ключ из криптографической пары ключей. Все эти сведения шифруются закрытым ключом из данной пары. Полученные за- шифрованные данные можно расшифровать соответствующим открытым ключом. Поскольку закрытый ключ есть лишь у автора сборки, никому кроме него не удас- тся создать копию строгого имени, что гарантирует подлинность сборки. Чтобы назначить сборке строгое имя, требуется пара ключей — открытый и за- крытый. При необходимости для их генерации применяют утилиту strong name (sn.exe). ^ Генерация пары криптографических ключей 1, Вызовите командную строку Visual Studio .NET. В Windows XP для этого доста- точно щелкнуть Пуск\Программы\МюгозоЛ Visual Studio .NET\Visual Studio .NET Tools. 2. Наберите в командной строке sn.exe с ключом -k , чтобы указать файл, кула следует записать генерированные ей ключи. Обычно этот файл имеет расшире- ние ,snk, например: sri -k [nyKey.snk В результате исполнения этой команды генерируется файл с парой ключей, ко- торый необходим для создания строгого имени. >• Как подписать сборку с помощью строгого имени 1. В Solution Explorer откройте файл Assemblylnfo. 2. Убедитесь, что для сборки задан номер версии при помощи атрибута Assembly- Version., например; Visual Basic .NET <Assembly: AssernblyVersion("1.0.1.1"}> Visual C# [assembly: AssemblyVersion("1.0.1.1")] По умолчанию атрибут Assembly Version установлен в «1.0.*». Звездочка показы- вает, что CLR автоматически генерирует значения по умолчанию для последних двух цифр номера версии. 3. При помощи атрибута Assembly Key FHeAnribute укажите путь (абсолютный ил и от- носительный) к файлу с ключами, например, так: Visual Basic .NET <Assembly: AssernblyKeyFile(". ,\. .\myKey.snk")> Visual C# [assembly: AssemblyKeyFile("..\\..\\rcyKey.snk")] Этот атрибут автоматически добавляется в файл Assemblylnfo при использова- нии Visual C#; в Visual Basic .NET его придется добавить самостоятельно. 4. Скомпилируйте сборку — она будет подписана при помощи сгенерированного строгого имени.