HOW TO:使用完整簽章為動態組件提供強式名稱
動態組件可以使用部分簽名或完整簽名來指定強式名稱。 對於部分簽署,公開金鑰 (Public Key) 必須在傳遞至 DefineDynamicAssembly 方法的 AssemblyName 中指定。 Common Language Runtime 在可移植執行檔 (PE) 內替強式名稱簽章 BLOB (二進位大型物件) 配置空間,但不會實際為組件簽名。 產生的組件可以使用 Windows Software Development Kit (SDK) 中提供的工具,於後置處理步驟中進行完整簽署。
對於完整簽名,必須要提供公開/私密金鑰組 (Key Pair)。 這些實體 (Entity) 通常存放在檔案或磁碟,或在加密 API 密碼編譯服務提供者 (CSP) 所擁有的金鑰容器中。 低安全性金鑰 (Key) 經常由軟體架構 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);