Gewusst wie: Verwenden der vollen Signierung, um einer dynamischen Assembly einen starken Namen zu geben
Einer dynamischen Assembly kann mithilfe einer teilweisen oder vollständigen Signierung ein starker Name zugewiesen werden. Für eine teilweise Signierung muss der öffentliche Schlüssel im AssemblyName angegeben werden, der an die DefineDynamicAssembly-Methode übergeben wird. Die Common Language Runtime reserviert den Speicherplatz innerhalb der PE (Portable Executable)-Datei für den Blob einer starken Namenssignatur, signiert die Assembly jedoch nicht. Die resultierende Assembly kann in einem Nachbearbeitungsschritt vollständig mithilfe von Tools signiert werden, die von Windows Software Development Kit (SDK) bereitgestellt werden.
Für eine vollständige Signierung muss ein öffentliches/privates Schlüsselpaar zur Verfügung gestellt werden. Diese Einheiten werden normalerweise in einer Datei, auf der Festplatte oder in einem Schlüsselcontainer gespeichert und gehören zu einem CSP (Crypto API Cryptographic Service Provider). Sicherheitsschlüssel unterer Stufe werden oft von softwarebasierten CSPs generiert und in eine Datei exportiert, sodass sie während der Projektentwicklung in Quellcode-Verwaltungssystemen überprüft werden können. Sicherheitsschlüssel hoher Stufe werden oft von der Hardware generiert, die normalerweise den Export von Sicherheitsschlüsseln aus Sicherheitsgründen verhindert. Auf solche Schlüsselpaare kann nur indirekt über einen Schlüsselcontainer zugegriffen werden. Das Schlüsselpaar mit starkem Namen wird mithilfe der System.Reflection.StrongNameKeyPair-Klasse angegeben.
Das folgende Beispiel veranschaulicht die Verwendung der vollständigen Signierung, um eine dynamischen Assembly einen starken Namen zu verleihen.
Beispiel
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);