.net - sirve - visual c++ caracteristicas
¿Hay una manera fácil de firmar un ensamblaje de CLI en C++ en VS 2010? (6)
Ahora mismo estoy configurando la opción Linker / Advanced / KeyFile.
Recibo el mensaje "mt.exe: advertencia general 810100b3: es un ensamblado con nombre seguro e incrustar un manifiesto invalida la firma. Deberá volver a firmar este archivo para que sea un ensamblado válido". .
Al leer desde la web, parece que tengo que configurar la opción de firma de demora, descargar el SDK y ejecutar sn.exe como un evento posterior a la compilación. ¿Seguramente debe haber una manera más fácil de hacer esta operación común en VS2010?
En mi experiencia, la forma más sencilla es:
1) Abra el símbolo del sistema de Visual Studio 2010. Vaya al directorio de su proyecto (es el directorio que contiene sus archivos de origen). Luego escriba sn -k yourKeyName.snk
.
2) Abra su proyecto en visual studio 2010 y abra el archivo AssemblyInfo.cpp y agregue esta línea [assembly:AssemblyKeyFileAttribute("yourKeyName.snk")];
.
3) Abra Proyecto-> Propiedades-> Vinculador-> Avanzado. Y en la ranura de "Archivo de clave" y ponga yourKeyName.snk
. También en la ranura "Signo de retardo", seleccione Yes (/DELAYSIGN)
.
4) Construye tu proyecto como de costumbre.
Hay una gran cantidad de cojeras aquí, esto nunca funcionó antes. Se solucionó en VS2010, mt.exe ahora genera una advertencia en lugar de dejar que esto salga mal en silencio. No es una solución real, y no hay una obvia, el enlazador no puede simplemente incrustar la firma y seguir permitiendo que mt.exe se ejecute después.
La solución es volver a firmar el ensamblaje con un evento posterior a la compilación. Haz que se vea así:
Command = sn -Ra "$ (TargetPath)" $ (ProjectName) .snk
Si aún no tiene el archivo clave, deberá crear el archivo .snk usted mismo, ejecute sn.exe desde el indicador de comandos de Visual Studio. por ejemplo:
cd /whereTheProjectIsLocated
sn.exe -k MyProject.snk
O extráigalo de un contenedor o use su archivo de clave designado. El retraso en la firma es solo una cuestión de ejecutar sn.exe con las opciones de línea de comando adecuadas.
La propuesta de Paul Mead está en el camino correcto, pero esto parece definitivo: http://blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx . Tenga en cuenta que es fácil cambiar el texto, pero omita cambiar el "%" a un "$".
La respuesta y el enlace de Phil Atkin es la manera de solucionar este error. Microsoft finalmente se dedicó a abordarlo para Visual Studio 2010, pero nunca lanzaron una revisión del Service Pack. Vaya a este enlace para ver la explicación de MS y las múltiples formas de solucionarlo.
http://blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx
Funciono para mi Gracias Phil (Yo votaría por ti, pero todavía soy un novato.)
Editar para Mzedeler:
Aquí está la información más relevante del enlace que la mayoría de las personas podrán usar. Se salta la historia y las implicaciones multiproyecto. (Vaya al enlace para ver esas cosas.)
Primero: arregla el error tipográfico en el proceso de construcción:
- En Windows 7: Vaya a Inicio-> Todos los programas-> Accesorios
- Haga clic con el botón derecho en el icono del símbolo del sistema y seleccione "Ejecutar como administrador" de la lista desplegable.
- Escriba: cd% Archivos de programa (x86)% / MSBuild / Microsoft.Cpp / v4.0 / Platforms / Win32
- Escriba: notepad Microsoft.Cpp.Win32.targets
- Encuentre el objetivo "LinkEmbedManifest" (busque: Nombre de destino = "LinkEmbedManifest")
- Bajo el objetivo anterior y en la tarea "<Enlace", realice los siguientes pasos.
- Cambiar propiedad DelaySign
- Desde: DelaySign = "% (Link.DelaySign)"
- Para: DelaySign = "$ (LinkDelaySign)"
- Verifique que cambió% a $ Y eliminó el período entre Enlace y Demora.)
- Cambiar propiedad KeyFile
- Desde: KeyFile = "% (Link.KeyFile)"
- Para: KeyFile = "$ (LinkKeyFile)"
- Verifique que cambió% a $ Y eliminó el período entre Enlace y Clave.)
- Guardar los cambios y salir del bloc de notas.
- Salga de la ventana de comandos escribiendo: Salir
Redefina las propiedades de "Archivo de clave" y "Signo de retardo" usadas para firmar su proyecto:
- Entra en MS Visual Studio 2010 y abre tu proyecto.
- Haga clic derecho en su "proyecto" para que aparezca la página de propiedades.
- Vaya a Propiedades de configuración-> Vinculador-> Avanzado
- Sobrescriba la propiedad "Archivo clave" con su archivo clave original. (por ejemplo, myfile.snk)
- Salir de la página de propiedades.
- Guarda y compila tu programa.
Estos pasos funcionaron para mi proyecto. Para más detalles, vaya al enlace de arriba que Phil proporcionó.
Edición final
Me encontré con este problema con VS2010 SP1 para la plataforma WIN32. Mirando el archivo .log de compilación, encontré que el parámetro / KEYFILE se asignó al enlace inicial para el .DLL, pero después de que se creó el manifiesto y se hizo el segundo enlace para incluir el manifiesto, faltaba el parámetro / KEYFILE. Después de mirar un poco, encontré que el problema está en el archivo Microsoft.Cpp.Win32.targets en C: / Archivos de programa (x86) / MSBuild / Microsoft.Cpp / v4.0 / Platforms / Win32. Hay un error tipográfico para el atributo KeyFile para el segundo enlace. Lo arreglé cambiando la línea 441:
KeyFile ="%(Link.KeyFile)"
a
KeyFile ="$(LinkKeyFile)"
Con ese cambio, el segundo paso del vinculador incluyó el calificador / KeyFile y el .DLL se construyó correctamente con la publicación incorporada.
Si no puedes / no quieres editar Microsoft.Cpp.Win32.targets, agregar lo siguiente al archivo de proyecto también funciona:
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- snip -->
<ItemDefinitionGroup>
<Link>
<KeyFile>$(LinkKeyFile)</KeyFile>
</Link>
</ItemDefinitionGroup>
</Project>