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?
Respuesta
Puede consultar mscoree
's strong name APIs, pero yo no lo recomendaría.
¿Por qué no? Estoy buscando hacer esto también, y no quiero generar sn.exe (principalmente porque quiero un mecanismo más "elegante") – DannyT
Estas API están en desuso, comenzando con .NET 4. –
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
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
oICLRMetaHostPolicy
llamando alCLRCreateInstance
. - 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 deICLRStrongName
llamandoICLRRuntime
'sGetInterface
método, pasandoCLSID_CLRStrongName
yIID_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.
- 1. IronRuby: ¿cómo exigir ensamblados .NET sin un nombre seguro?
- 2. ¿Cuál es el 'nombre del módulo' cuando se usa al.exe para firmar un ensamblado con un nombre seguro?
- 3. Firma de .NET Assemblies
- 4. ¿Cómo marcar un conjunto .net como seguro?
- 5. ¿Hay algún problema con NO firmar un ensamblado de .NET?
- 6. ¿Resolviendo una referencia de ensamblado .NET a un nombre diferente?
- 7. Comprobación de un ensamble para un nombre seguro
- 8. Firmar mi ensamblado con un nombre seguro lo detiene de funcionar
- 9. ¿Cómo leo la información de firma digital de un ensamblado .Net firmado?
- 10. ¿Cómo registrar un ensamblado .NET como COM?
- 11. ¿Cuál es el punto de la demora en la firma de un ensamblado .NET?
- 12. ¿Es posible registrar un ensamblado .NET como COM sin darle un nombre fuerte?
- 13. ¿Cómo incrustar un archivo de texto en un ensamblado .NET?
- 14. System.BadImageFormatException Se intentó cargar un programa con un formato incorrecto
- 15. Grupos con nombre opcional Python re
- 16. ¿Interactuar con ffmpeg desde un programa .NET?
- 17. ¿Comparar 2 versiones de un ensamblado .NET?
- 18. ¿Cómo se resuelve un ensamblaje en .NET?
- 19. firma automática de código "seguro"
- 20. Obteniendo la fecha de un ensamblado .NET
- 21. ¿Se necesita instalar un ensamblado COM + (.net) en el GAC?
- 22. ¿Por qué exactamente el regasm me advierte sobre la firma con un nombre fuerte?
- 23. ¿Cómo se diseña un programa funcional?
- 24. ¿Cómo invocar el mismo programa con un nombre diferente?
- 25. EncuadernaciónRedireccionar a un nombre de ensamblado diferente
- 26. Creación de un administrado (/ CLR) C++ ensamblado con nombre-
- 27. Cómo averiguar si se compiló un ensamblado .NET con el indicador TRACE o DEBUG
- 28. ¿Cómo se firma un ensamblaje generado por una operación de ILMerge?
- 29. ¿Cómo agrego un ensamblado .NET al GAC en InnoSetup?
- 30. ¿Cómo averiguo si un ensamblado .NET contiene código no administrado?
He eliminado una respuesta (línea de comando); No conozco otras formas de hacerlo, excepto la línea de comando ('sn -R', etc.) –
¿Encontró una forma de hacerlo? – DannyT
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). –