방법: 전체 서명을 사용하여 동적 어셈블리에 강력한 이름 지정
부분 서명이나 전체 서명을 사용하여 동적 어셈블리에 강력한 이름을 지정할 수 있습니다. 부분 서명의 경우 DefineDynamicAssembly 메서드에 전달된 AssemblyName에 공개 키를 지정해야 합니다. 공용 언어 런타임은 강력한 이름 서명 blob에 대해 PE 파일(이식 가능한 실행 파일) 내에 공간을 할당하지만 실제로 어셈블리를 서명하지 않습니다. 결과 어셈블리를 Windows SDK(소프트웨어 개발 키트)에서 제공하는 도구를 사용하여 후처리 단계에서 전체 서명할 수 있습니다.
전체 서명의 경우 전용/공개 키 쌍을 제공해야 합니다. 이 엔터티는 대개 파일이나 디스크 또는 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);