2009-03-28 21 views
6

Además de invocar la línea de comando para agregar un nombre seguro a un ensamblaje, ¿hay alguna API disponible que le permita renunciar a un ensamblado una vez que se le haya quitado su nombre seguro?¿Cómo se programa (re) firma un ensamblado .NET con un nombre seguro?

+0

He eliminado una respuesta (línea de comando); No conozco otras formas de hacerlo, excepto la línea de comando ('sn -R', etc.) –

+0

¿Encontró una forma de hacerlo? – DannyT

+0

Un ensamblaje no es necesariamente "Despojado" de su nombre fuerte tanto como se creó sin uno, o el que tiene se convierte en inválido (debido a la manipulación). –

Respuesta

2

Puede consultar mscoree's strong name APIs, pero yo no lo recomendaría.

+0

¿Por qué no? Estoy buscando hacer esto también, y no quiero generar sn.exe (principalmente porque quiero un mecanismo más "elegante") – DannyT

+0

Estas API están en desuso, comenzando con .NET 4. –

+0

Solo están en desuso debido a la introducción de SxS in-proc en .NET 4; es decir, las funciones estáticas globales están en desuso. La propia API de nomenclatura fuerte no administrada no está en desuso, solo tiene que llamarla desde las interfaces de alojamiento (específicamente, ICLRStrongName: http://msdn.microsoft.com/en-us/library/dd409349.aspx). – hbw

3

Depende de lo que quiere decir que un conjunto está "despojado de su nombre fuerte". Si un ensamblado no tiene un nombre fuerte, nada (ni siquiera sn.exe) puede renunciar al ensamblaje hasta que se haya reconstruido con un nombre seguro.

Pero para responder a su pregunta: toda la funcionalidad de nomenclatura fuerte se expone a través del CLR unmanaged strong naming API. Específicamente, desea StrongNameSignatureGenerationEx, que, como notará, es funcionalmente equivalente al comando sn -R[a].

Dicho esto, es mucho más simple y más fácil simplemente invocar sn.exe sí. El acceso a las API de nombre seguro no administradas no es para los débiles, ya que (a partir de .NET 4) primero se ve obligado a pasar por las API de metahosting de CLR. Por esta razón, también estás muy atascado con tener que hacer esto completamente en código no administrado. (Lo que encontrar un managed wrapper from Microsoft on CodePlex, pero no pude conseguir StrongNameSignatureGenerationEx funcione correctamente a través de él.)

Si usted tiene que, sin embargo, aquí hay un esbozo de cómo acceder a los fuertes API de denominación de código no administrado:

  • Obtenga una instancia de ICLRMetaHost o ICLRMetaHostPolicy llamando al CLRCreateInstance.
  • Con esa instancia, obtenga una instancia del tiempo de ejecución actual (es decir, una instancia de ICLRRuntimeInfo). Hay numerosas formas de hacer esto; ver MSDN para los detalles sangrientos.
  • Una vez que tenga una instancia de ICLRRuntimeInfo, obtener una instancia de ICLRStrongName llamando ICLRRuntime 's GetInterface método, pasando CLSID_CLRStrongName y IID_ICLRStrongName para los identificadores de clase/interfaz.

Ahora que tiene una instancia de ICLRStrongName, que finalmente puede llamar StrongNameSignatureGenerationEx usarlo:

// This is the ICLRStrongName instance you'll need. Assume GetStrongNameAPI 
// corresponds to an implementation of the rough process I outlined above. 
ICLRStrongName *snAPI = GetStrongNameAPI(); 

// You'll have to load the .snk file into memory yourself using the Win32 
// file APIs, the details of which I've omitted for the sake of brevity. 
BYTE *keyPairBlob = NULL; 
DWORD keyPairBlobSize = 0; 
LoadKeyPair(&keyPairBlob, &keyPairBlobSize); 

// Once you've got the key pair blob, you can now (re-)sign the assembly 
HRESULT hr = snAPI->StrongNameSignatureGenerationEx(
    L"path\\to\\your\\assembly.dll", 
    NULL, 
    keyPairBlob, 
    keyPairBlobSize, 
    NULL, 
    NULL, 
    0 
); 

// Do whatever error handling needs to be done with the given HRESULT 

(Opcionalmente, si desea firmar con un contenedor de claves en lugar de un par de claves .snk, se puede pasar en el nombre del contenedor de claves como el segundo argumento y dejar los parásitos clave blob/size argumentos como NULL.)

Conclusión: Como puede ver, a menos que realmente tenga que pasar por la fuerte API de nomenclatura , eso es mucho más fácil de (re) firmar un ensamblado al invocar sn.exe.

Cuestiones relacionadas