方法: 完全署名を使用して動的アセンブリに厳密な名前を指定する
動的アセンブリに厳密な名前を指定できます。厳密な名前を指定するには、部分署名または完全署名を使用します。 部分署名を使用する場合は、DefineDynamicAssembly メソッドへ渡される AssemblyName に公開キーを指定する必要があります。 共通言語ランタイムでは、ポータブル実行可能 (PE) ファイル内に厳密な名前署名 BLOB のための領域が割り当てられますが、アセンブリに実際に署名されるわけではありません。 生成されたアセンブリには、Windows Software Development Kit (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);