Comment : utiliser une signature complète pour donner un nom fort à un assembly dynamique
Mise à jour : novembre 2007
Un nom fort peut être attribué à un assembly dynamique en utilisant une signature partielle ou une signature complète. Pour la signature partielle, la clé publique doit être spécifiée dans AssemblyName passé à la méthode DefineDynamicAssembly. Le Common Language Runtime alloue de l'espace dans le fichier exécutable portable (PE, Portable Executable) pour un objet binaire volumineux (BLOB) de signature de nom fort, mais ne signe pas réellement l'assembly. L'assembly résultant peut être complètement signé au cours d'une étape de post-traitement en utilisant les outils fournis dans le Kit de développement logiciel (SDK) Windows.
Pour une signature complète, une paire de clés publiques/privées doit être fournie. Ces entités sont généralement stockées dans un fichier, sur un disque ou dans un conteneur de clé appartenant à un fournisseur de services de chiffrement (CSP, Cryptographic Service Provider) CryptoAPI. Les clés à basse sécurité sont souvent générées par des CSP logiciels et exportées dans un fichier pour pouvoir être archivées dans les systèmes de gestion de code source au cours du développement d'un projet. Les clés à haute sécurité sont souvent générées par le matériel, ce qui empêche généralement leur exportation pour des raisons de sécurité. De telles paires de clés sont uniquement accessibles indirectement via un conteneur de clé. La paire de clés de nom fort est spécifiée en utilisant la classe System.Reflection.StrongNameKeyPair.
L'exemple suivant montre comment utiliser une signature complète pour donner un nom fort à un assembly dynamique.
Exemple
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 myAppDomain As AppDomain = Thread.GetDomain()
Dim ab As AssemblyBuilder = myAppDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave)
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);