Практическое руководство. Использование полной подписи для присваивания строгого имени динамической сборке
Строгое имя может быть присвоено динамической сборке с использованием частичной подписи или полной подписи. Для частичной подписи в объекте AssemblyName, переданном в метод DefineDynamicAssembly, должен быть указан открытый ключ. Среда CLR выделяет в переносимом исполняемом файле (PE) место для BLOB-объекта подписи строгого имени, но фактически подпись сборки не осуществляется. Полученная в итоге сборка может быть полностью подписана на этапе после обработки с помощью инструментов, предоставляемых Пакет средств разработки программного обеспечения (SDK) для Windows.
Для полной подписи должна быть предоставлена пара, состоящая из открытого и закрытого ключа. Эти объекты обычно хранятся в файле или на диске, либо же в контейнере ключа, предоставляемом интерфейсом Crypto API криптопровайдера (CSP). Ключи с низким уровнем защиты часто создаются CSP программным образом и экспортируются в файл, так что их можно проверить в системах управления исходного кода во время разработки проекта. Ключи с высоким уровнем защиты часто создаются аппаратным образом, что обычно не позволяет экспортировать такие ключи по соображениям безопасности. Доступ к таким парам ключей возможен только непосредственно через контейнер ключа. Пара ключей строгого имени задается с использованием класса System.Reflection.StrongNameKeyPair.
В следующем примере демонстрируется использование полной подписи для присваивания строгого имени динамической сборке.
Пример
Imports System
Imports System.IO
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Class SNKToAssembly
Public Shared Sub Main()
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 appDomain As AppDomain = Thread.GetDomain()
Dim ab As AssemblyBuilder = _
appDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave)
End Sub
End Class
' Construct a StrongNameKeyPair object. This object should obtain
' the public key from the Company.keys file.
Dim k As Reflection.StrongNameKeyPair = _
New Reflection.StrongNameKeyPair(fs)
using System;
using System.IO;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
class SNKToAssembly
{
public static void Main()
{
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);
}
}
// Construct a StrongNameKeyPair object. This object should obtain
// the public key from the Company.keys file.
StrongNameKeyPair k = new StrongNameKeyPair(fs);
using namespace System;
using namespace System::IO;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class SNKToAssembly
{
public:
static void Main()
{
FileStream^ fs = gcnew FileStream("SomeKeyPair.snk", FileMode::Open);
StrongNameKeyPair^ kp = gcnew StrongNameKeyPair(fs);
fs->Close();
AssemblyName^ an = gcnew AssemblyName();
an->KeyPair = kp;
AppDomain^ appDomain = Thread::GetDomain();
AssemblyBuilder^ ab = appDomain->DefineDynamicAssembly(an, AssemblyBuilderAccess::RunAndSave);
}
};
int main()
{
SNKToAssembly::Main();
}
// Construct a StrongNameKeyPair object. This object should obtain
// the public key from the Company.keys file.
StrongNameKeyPair^ k = gcnew StrongNameKeyPair(fs);
См. также
Основные понятия
Создание и использование сборок со строгими именами