Procedura: utilizzare la firma completa per assegnare un nome sicuro a un assembly dinamico
Aggiornamento: novembre 2007
È 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 risultante al termine dell'elaborazione utilizzando gli strumenti forniti in Windows Software Development Kit (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 sicurezza 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 sicurezza vengono spesso generate da hardware che in genere impedisce l'esportazione delle chiavi per ragioni di sicurezza. È possibile accedere alle coppie di chiavi di questo tipo solo indirettamente attraverso un contenitore di chiavi. La coppia di chiavi con nome sicuro è specificata tramite la classe System.Reflection.StrongNameKeyPair
Nell'esempio che segue è mostrato l'utilizzo della firma completa per assegnare un nome sicuro all'assembly dinamico.
Esempio
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);