Версия сборки Номер версии сборки имеет формат major.minor.build.revision. Например, 2.3.0.0 Значения major(старший), minor(младший), build (компоновка) и revision(ревизия) – неотрицательные целые числа. Значения старших и младших номеров должны обязательно присутствовать в номере версии сборки. Номер версии можно задать с помощью атрибута [ AttributeUsageAttribute(AttributeTargets.Assembly, Inherited=false)] public sealed class AssemblyVersionAttribute : Attribute Атрибут имеет один обязательный параметр – строка в формате major.minor.build.revision или major.minor.*. Например, [assembly: AssemblyVersion("1.0.0.0")] Соглашения о номере версии сборки Приняты следующие соглашения относительно версий сборки: Major Сборки с одним и тем же именем, но с разными значениями старшего номера версии не взаимозаменяемы. Например, значение major заменяется, если нет обратной совместимости с предыдущей версией. Minor Сборки с совпадающими именами и старшими номерами, которые отличаются младшими (minor) номерами , предполагают полную обратную совместимость с предыдущей версией. Build Отличие в номере компоновки означает перекомпиляцию одного и того же исходного файла для разных процессоров, платформ или другого компилятора. Revision Сборки с совпадающими именами, старшими и младшими номерами, но с разными ревизиями(revisions) полностью взаимозаменяемы. Это версии с небольшими изменениями и исправлениями, связанными, например, с решением проблем защиты в предыдущих версиях. Строгое имя сборки .NET Framework поддерживает два вида сборок • с нестрогими именами (weakly named); • cо строгими именами (strong named). По умолчанию при компиляции создаются сборки с нестрогими именами (weakly named). Для сборки с нестрогим именем разрешено только закрытое (private) развертывание – в обычном каталоге. Для идентификации сборки с нестрогим именем CLR использует только имя из декларации сборки. При создании сборки со строгим именем (strongly named) используется криптографическая пара – открытый и закрытый ключи. Для сборки со строгим именем разрешено как закрытое, так и открытое развертывание – в глобальном кэше сборок (Global Assembly Cache - GAC). Для идентификации сборки со строгим именем CLR использует имя сборки, открытый ключ, номер версии и строку региональных стандартов (если она есть). Сборки со строгим именем Для сборки со строгим именем необходимо сгенерировать пару ключей (открытый и закрытый). Это можно сделать с помощью • утилиты SN.exe; • встроенных средств Visual Studio 2008. В результате будет создан файл, содержащий криптографическую пару ключей - открытый и закрытый ключи в двоичном формате. Чтобы подписать сборку строгим именем, в исходный текст сборки достаточно добавить атрибут [assembly: AssemblyKeyFile(“Имя_файла.keys”)] Компилятор подпишет сборку закрытым ключом и встроит открытый ключ в декларацию сборки. Сборки со строгим именем -2 Когда сборка подписывается закрытым ключом: • при компоновке для каждого файла сборки рассчитывается хэш содержимого файла и вместе с именем файла сохраняется в декларации сборки; • после компоновки исполняемого PE-файла рассчитывается хэш содержимого файла с декларацией; • значение хэша подписывается закрытым ключом и результат (цифровая подпись RSA) заносится в PE-файл; • открытый ключ заносится в PE-файл. Строгое имя сборки (имя файла, версия сборки, региональные стандарты и открытый ключ) гарантировано является уникальным. В таблице ссылок на другие сборки хранятся не открытые ключи, а маркеры открытого ключа - последние 8 байт хэша открытого ключа. Сборки со строгим именем -3 Подписание сборки закрытым ключом защищает сборку от модификации, так как • при установке сборки в GAC Windows вычисляет хэш файла сборки, в котором находится декларация, и сравнивает полученное значение с цифровой подписью RSA, встроенной в PE-файл, используя открытый ключ, который тоже находится в PE-файле. • система вычисляет хэш-значения содержимого остальных файлов сборки и сравнивает их с теми значениями, которые хранятся в декларации. • если хотя бы одно значение не совпадает, сборка не будет установлена в GAC. В Visual Studio 2008 есть встроенные средства для создания сборки со строгим именем: Project / Properties / Signing / Sign the assembly Информация о сборке в процессе выполнения Информацию о сборке при выполнении приложения можно получить с помощью механизма отражения. В классе System.Type определено свойство public abstract Assembly Assembly { get; } Класс Assembly можно использовать для • загрузки сборок; • анализа метаданных сборки; • создания объектов определенных в сборке типов. Некоторые свойства класса Assembly public virtual string FullName { get; } // Имя сборки public bool GlobalAssemblyCache { get; } // Загружена из GAC public virtual string ImageRuntimeVersion { get; } // Версия CLR для сборки Информация о версии сборки Информацию о версии сборки при выполнении приложения можно получить с помощью метода класса Assembly public virtual AssemblyName GetName (); Класс AssemblyName содержит • простое имя (simple name); • номер версии (version number); • открытый/закрытый ключи(cryptographic key pair); • региональные стандарты (supported culture). Доступ к информации дают свойства и методы класса AssemblyName: public Version Version { get; set; } public CultureInfo CultureInfo { get; set; } public string Name { get; set; } public byte[] GetPublicKey ();