Практическое руководство: использование полной подписи для присваивания строгого имени динамической сборке
Обновлен: Ноябрь 2007
Строгое имя может быть присвоено динамической сборке с использованием частичной подписи или полной подписи. Для частичной подписи в объекте AssemblyName, переданном в метод DefineDynamicAssembly, должен быть указан открытый ключ. Среда CLR выделяет в переносимом исполняемом файле (PE) место для BLOB-объекта подписи строгого имени, но фактически подпись сборки не осуществляется. Полученная в итоге сборка может быть полностью подписана на этапе после обработки с помощью инструментов, предоставляемых SDK (пакет средств разработки программного обеспечения) для Windows.
Для полной подписи должна быть предоставлена пара, состоящая из открытого и закрытого ключа. Эти объекты обычно хранятся в файле или на диске, либо же в контейнере ключа, предоставляемом интерфейсом Crypto API криптопровайдера (CSP). Ключи с низким уровнем защиты часто создаются CSP программным образом и экспортируются в файл, так что их можно проверить в системах управления исходного кода во время разработки проекта. Ключи с высоким уровнем защиты часто создаются аппаратным образом, что обычно не позволяет экспортировать такие ключи по соображениям безопасности. Доступ к таким парам ключей возможен только непосредственно через контейнер ключа. Пара ключей строгого имени задается с использованием класса System.Reflection.StrongNameKeyPair.
В следующем примере демонстрируется использование полной подписи для присваивания строгого имени динамической сборке.
Пример
Dim fs As New FileStream("SomeKeyPair.snk", FileMode.Open)
Dim kp As New StrongNameKeyPair(fs)
fs.Close()
Dim an As New AssemblyName()
an.KeyPair = kp
Dim myAppDomain As AppDomain = Thread.GetDomain()
Dim ab As AssemblyBuilder = myAppDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave)
FileStream fs = new FileStream("SomeKeyPair.snk", FileMode.Open);
StrongNameKeyPair kp = new StrongNameKeyPair(fs);
fs.Close();
AssemblyName an = new AssemblyName();
an.KeyPair = kp;
AppDomain appDomain = Thread.GetDomain();
AssemblyBuilder ab = appDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave);