Public Key Token eines Assemblies ermitteln

Wenn man ein .NET Assembly mit einem Strong Name versehen hat, möchte man manchmal den „PublicKeyToken“ dieses Assemblies aus einem anderen Assembly ermitteln. Im ersten Schritt wird dazu das Assembly benötigt. Wenn es bereits eingebunden ist, kann mittels:

Assembly[] assemblies=AppDomain.CurrentDomain.GetAssemblies();

das richtige Assembly gesucht werden. Alternativ ist es auch möglich ein Assembly mittels:

Assembly assembly=Assembly.LoadFile(path);

von der Festplatte zu laden. Danach geht es an die Ermittlung des Public Key Tokens:

string[] parts=assembly.FullName.Split(new char[]{','}, StringSplitOptions.RemoveEmptyEntries);
string publicKeyToken=parts[parts.Length-1].Trim().Replace("PublicKeyToken=", "");

Dieses könnte dann in der Applikation mit einem bestehenden Schlüssel verglichen werden um die Integrität des geladenen Assemblies zu verifizieren.

Strong Name für eine .NET Applikation erzeugen

Unter .NET kann man Assemblies mit einem „Strong Name“ versehen. Dieser sorgt dafür das dass Assembly eindeutig identifiziert werden kann. Möchte man einen solchen erstellen so benötigt man zuerst ein Schlüsselpaar welches mit dem „Strong Name Utility“ angelegt wird:

sn –k keypair.snk

Das Tool befindet sich dabei im Windows SDK Ordner (z.B. C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A) wobei sich die Version des SDKs durchaus unterscheiden kann. Die erzeugte Snk-Datei wird dabei dem Projekt hinzugefügt. Anschließend stellt man in den Projekteinstellungen unter „Signing“ die entsprechende Datei ein. In diesem Tab ist es auch möglich eine neue Schlüsseldatei zu generieren, so das man für den Schritt der Erzeugung nicht auf das „Strong Name Utility“ angewiesen ist.

Die Projektoptionen im Visual Studio

Die Projektoptionen im Visual Studio

Bei der Signierung ist es wichtig darauf zu achten, das alle Bibliotheken ebenfalls mit einem Strong Name versehen sind, sonst verweigert das Studio die Signierung der Anwendung. Möchte man aus dem signierten Assembly den öffentlichen Schlüssel extrahieren, so kommt wieder das „Strong Name Utility“ zur Anwendung:

sn -e Assembly.exe public.pk

Das Schlüsselpaar welches man erzeugt hat, kann man dabei für alle eigenen Anwendungen benutzen. Es ist nicht nötig, für jede Anwendung ein eigenes Schlüsselpaar zu erzeugen, da sich der „SimpleName“ bei jedem Assembly unterscheidet.

Weitere Informationen gibt es unter:
http://msdn.microsoft.com/en-us/magazine/cc163583.aspx
http://msdn.microsoft.com/en-us/library/h4fa028b%28v=vs.80%29.aspx