Assegnazione di un nome sicuro a un assembly dinamico

È possibile assegnare un nome sicuro a un assembly dinamico tramite firma parziale o firma completa. Per la firma parziale è necessario specificare la chiave pubblica nell'AssemblyName passato al metodo DefineDynamicAssembly. Common Language Runtime alloca, all'interno del file eseguibile portabile (PE, Portable Executable) lo spazio per un blob di firma di un nome sicuro, ma non firma effettivamente l'assembly. Sarà possibile assegnare una firma completa all'assembly al termine dell'elaborazione utilizzando strumenti forniti in .NET Framework SDK.

Per la firma completa è necessario fornire una coppia di chiavi pubblica/privata. Queste entità sono in genere memorizzate in un file, su un disco oppure in un contenitore di chiavi fornito da un provider del servizio di crittografia (CSP, Cryptographic Service Provider) di API crittografiche. Le chiavi a bassa protezione vengono spesso generate da provider CSP basati su software ed esportate in un file in modo da poter essere verificate nei sistemi di gestione del codice sorgente durante lo sviluppo del progetto. Le chiavi ad alta protezione vengono spesso generate da hardware che in genere impedisce l'esportazione delle chiavi per ragioni di protezione. È possibile accedere alle coppie di chiavi di questo tipo solo indirettamente attraverso un contenitore di chiavi. La coppia di chiavi per il nome sicuro è specificata mediante la classe System.Reflection.StrongNameKeyPair.

Nell'esempio che segue è mostrato l'utilizzo della firma completa per assegnare un nome sicuro all'assembly dinamico.

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)
[C#]
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);

Vedere anche

Utilizzo della reflection emit | Assembly con nome sicuro | Creazione e utilizzo degli assembly con nome sicuro