13_C#_Сборки

advertisement
Версия сборки
 Номер версии сборки имеет формат 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 ();
Download