2010-04-16 13 views
21

Ahora estoy configurando la opción Enlazador/Avanzado/KeyFile.¿Existe alguna manera fácil de firmar un ensamblado C++ CLI en VS 2010?

Obtengo el "mt.exe: advertencia general 810100b3: es un ensamblado firmado con un nombre fuerte e incrustando un manifiesto invalida la firma. Necesitará volver a firmar este archivo para que sea un ensamblaje válido"..

Al leer desde la web, parece que tengo que configurar la opción de firma de retraso, descargar el SDK y ejecutar sn.exe como un evento de compilación posterior. Seguramente debe haber una manera más fácil de hacer esta operación común en VS2010?

Respuesta

14

Hay una buena cantidad de cojera aquí, esto nunca funcionó antes. Se "arregló" 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 solución obvia, el vinculador no puede insertar la firma y aún así permitir que mt.exe se ejecute posteriormente.

La solución es volver a firmar el conjunto con un evento posterior a la construcción. Hacer que se vea como esto:

Command = sn Ra "$ (targetPath)" $ (Nombre del Proyecto) .snk

Si usted no tiene ya el archivo de clave, se le Necesita crear el archivo .snk usted mismo, ejecute sn.exe desde el símbolo del sistema de Visual Studio. por ejemplo:

cd \whereTheProjectIsLocated 
sn.exe -k MyProject.snk 

O extráigalo de un contenedor o use el archivo de clave designado. La firma de retardo es solo cuestión de ejecutar sn.exe con las opciones de línea de comando adecuadas.

+0

No es lo que quería escuchar. Necesita cotizaciones alrededor de $ (TargetPath). Sugerencias: Agregar: especifique KeyFile y DelaySign para que mt.exe se cierre. Agregue: opción q para hacer que sn.exe se calle. – jyoung

+2

Me parece que esto funcionó bien en Visual Studio 2008: el manifiesto está incrustado sin advertencia y el ensamblaje resultante todavía está firmado correctamente (sn -v informa que no hay errores). ¿Conoces más detalles sobre por qué esto cambió en VS 2010? – Charlie

+2

Vote para solucionarlo en MSDN Connect: https://connect.microsoft.com/VisualStudio/feedback/details/464524/mt-error-810100b – brickner

1

Me encontré con este problema con VS2010 SP1 para la plataforma WIN32. Al observar el archivo .log de compilación encontré que el parámetro/KEYFILE se le dio al enlace inicial para .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 enlazador pase incluido el calificador/KeyFile y la DLL se construyó correctamente con el publickey incrustado.

13

Si no puede/no editar Microsoft.Cpp.Win32.targets, añadiendo lo siguiente en el archivo de proyecto también trabaja: respuesta

<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- snip --> 
    <ItemDefinitionGroup> 
     <Link> 
     <KeyFile>$(LinkKeyFile)</KeyFile> 
     </Link> 
    </ItemDefinitionGroup> 
</Project> 
+1

¡Hiciste mi día! Esto solucionó el problema de que nuestra aplicación C++/CLI no se está firmando. Y su enfoque lo solucionó de una vez y para todos los miembros del equipo (gracias por SVN :)) – Kluyg

+1

Salvavidas. Esto solucionó mi problema y ahora la solución está registrada con la fuente. –

+0

De acuerdo, esto es mucho mejor que tener que forzar a las personas a hackear el archivo .targets en su instalación de VS2010. Gracias, @ user634175! –

0

Phil Atkin y el enlace es la manera de solucionar este error. Microsoft finalmente resolvió abordarlo para Visual Studio 2010, pero nunca lanzaron una solución de paquete de servicio. Vaya a este enlace para obtener la explicación de MS y varias formas de solucionarlo.

http://blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx

que trabajó para mí. Gracias Phil. (Yo voto por ti, pero todavía soy un novato.)

Editar para Mzedeler:
Aquí es la información más relevante desde el enlace que la mayoría de la gente será capaz de utilizar. Se saltea la historia y las implicaciones de proyectos múltiples. (Ir al enlace para ver esas cosas.)

Primero: Corregir el error en el proceso de construcción:

  1. En Windows 7: Ir a Inicio-> Todos los programas-> Accesorios
  2. clic derecho en el ícono del Símbolo del sistema y seleccione "Ejecutar como administrador" en la lista desplegable.
  3. escriba: cd% ProgramFiles (x86)% \ MSBuild \ Microsoft.Cpp \ v4.0 \ \ plataformas Win32
  4. Tipo en: Libreta Microsoft.Cpp.Win32.targets
  5. encontrar el objetivo “LinkEmbedManifest” (busque: Nombre de destino = "LinkEmbedManifest")
  6. Según el objetivo anterior y en la tarea "< Enlace", realice los siguientes pasos.
  7. de cambio de propiedad DelaySign
    • Desde: DelaySign = "% (Link.DelaySign)"
    • Para: DelaySign = "$ (LinkDelaySign)"
    • Compruebe que ha cambiado% a $ y se retira el período entre el Enlace y Delay)
  8. de cambio de propiedad KeyFile
    • De:. KeyFile = "% (Link.KeyFile)"
    • Para: KeyFile = "$ (LinkKeyFile)"
    • Compruebe que ha cambiado% a $ y se retira el período entre el vínculo y la llave.)
  9. guardar los cambios y salir de la libreta.
  10. salir de la ventana de comandos escribiendo: Salir

redefinir el “archivo de clave” y propiedades “Muestra del retardo” se emplean para firmar su proyecto:

  1. Entrar en MS Visual Studio 2010 y abierta tu proyecto.
  2. Haga clic derecho en su "proyecto" para abrir la página de propiedades.
  3. Vaya a Propiedades de configuración-> Enlazador-> Avanzado
  4. Sobrescriba la propiedad "Archivo de clave" con su archivo de clave original. (por ejemplo, myfile.snk)
  5. Salga de la página de propiedades.
  6. Guarde y compile su programa.

Estos pasos funcionaron para mi proyecto. Para obtener más detalles, vaya al enlace de arriba que proporcionó Phil.

Fin Editar

+0

Normalmente, proporcionar enlaces a las respuestas no es la manera de hacerlo en stackexchange, pero puedo ver que la respuesta es bastante larga. ¿Hay alguna manera de reducirla y proporcionarla aquí? – mzedeler

1

En mi experiencia, la forma más sencilla es:

1) abrir el sistema de Visual Studio 2010 Prompt. Vaya a su directorio de proyectos (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-> Enlazador-> Avanzado. Y en el espacio "Key File" y ponga yourKeyName.snk. También en el espacio "Señal de retraso" seleccione Yes (\DELAYSIGN).

4) Construya su proyecto como siempre.

Cuestiones relacionadas