Cómo: Utilizar la firma total para asignar un nombre seguro a un ensamblado dinámico
Actualización: noviembre 2007
A un ensamblado dinámico se le puede asignar un nombre seguro con firma parcial o firma total. En el caso de la firma parcial, debe especificarse la clave pública en el objeto AssemblyName que se pasa al método DefineDynamicAssembly. Common Language Runtime asigna espacio para un objeto binario de firma de nombre seguro en el archivo ejecutable portable (PE), pero en realidad no firma el ensamblado. El ensamblado obtenido se puede firmar totalmente en un paso de procesamiento posterior mediante las herramientas proporcionadas en Kit de desarrollo de software de Windows (SDK).
En el caso de la firma total, se debe proporcionar un par de claves pública y privada. Normalmente, estas entidades se almacenan en un archivo o en un disco, o en un contenedor de claves que pertenezca a un proveedor de servicios criptográficos (CSP) Crypto API. Los CSP de software suelen generar claves de seguridad baja y después las exportan a un archivo de manera que puedan comprobarse en los sistemas de administración de código fuente durante el desarrollo de proyectos. Con frecuencia, las claves de seguridad alta suelen ser generadas por hardware que ayuda a impedir la exportación de claves por razones de seguridad. El acceso a dichos pares de claves sólo es posible de manera indirecta, a través de un contenedor de claves. El par de claves de nombre seguro se especifica mediante la clase System.Reflection.StrongNameKeyPair.
En el ejemplo siguiente se muestra el uso de la firma completa para proporcionar un nombre seguro a un ensamblado dinámico.
Ejemplo
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);