2012-09-20 22 views
6

Mi instalación de ClickOnce con un error:"Archivo tiene un hash calculado diferente a la especificada en el manifiesto" error al firmar el EXE no

File, WindowsFormsProject.exe, has a different computed hash than specified in manifest.

utilizo MSBuild para generar paquete de implementación de ClickOnce. La línea correspondiente de la escritura de la estructura:

<MSBuild Targets="Publish" 
     Projects="WindowsFormsProject.csproj" 
     ContinueOnError="false" /> 

la WindowsFormsProject.csproj tiene un paso posterior a la generación que firma el ejecutable, de la siguiente manera:

signtool sign /a $(ProjectDir)\obj\$(PlatformName)\$(ConfigurationName)\$(TargetFileName) 

El problema es que cuando miro a la acumulación log: veo que el manifiesto se genera ANTES de que se ejecute el evento Post-Build. Entonces, no es sorprendente que los códigos hash no coincidan. Las líneas relevantes del registro de generación:

_CopyManifestFiles:

WindowsFormsProject -> ...\WindowsFormsProject.application

...

PostBuildEvent:

Successfully signed: ...\WindowsFormsProject.exe

Por lo tanto, las preguntas son:

  1. ¿Hay alguna forma para firmar el ensamblado antes de generar el manifiesto durante la MSBuild > tarea <?
  2. ¿Hay alguna forma de volver a generar el manifiesto (y solo el manifiesto) una vez completada la compilación para que los códigos hash coincidan de nuevo?

O, si puede pensar en una solución diferente al problema, agradecería sus ideas.

Respuesta

8

Si está utilizando MSBuild 4, puede usar propiedad AfterTargets para firmar el ensamblaje justo después de haber sido creado y antes de seguir con los pasos. Retire su paso posterior a la generación y añade este bloque para su proyecto en su lugar:

<Target Name="SignOutput" AfterTargets ="CoreCompile"> 
    <PropertyGroup> 
    <TimestampServerUrl>http://timestamp.verisign.com/scripts/timstamp.dll</TimestampServerUrl> 
    <ApplicationDescription>Foo bar</ApplicationDescription> 
    <SigningCertificateCriteria>/sha1 578a9486f10ed1118f2b5f428afb842e3f374793</SigningCertificateCriteria> 
    </PropertyGroup> 
    <ItemGroup> 
    <SignableFiles Include="$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)\$(TargetName)$(TargetExt)" /> 
    </ItemGroup> 
    <GetFrameworkSdkPath> 
      <Output 
       TaskParameter="Path" 
       PropertyName="SdkPath" /> 
    </GetFrameworkSdkPath> 
    <Exec Command="&quot;$(SdkPath)bin\signtool&quot; sign $(SigningCertificateCriteria) /d &quot;$(ApplicationDescription)&quot; /t &quot;$(TimestampServerUrl)&quot; &quot;%(SignableFiles.Identity)&quot;" /> 
</Target> 
+0

En caso de que alguien cometa el mismo error que yo ... Interpreté esta respuesta 'Postbuild' con' Target'. Esto es incorrecto. 'Target' debe estar en el nivel del proyecto. –

3

El mérito es de Dmitriy por su respuesta. Sin embargo, tuve que hacer pequeños cambios en la respuesta de Dmitry para que funcionara para mí. Específicamente:

  • que añade una etiqueta final de "Objetivo"
  • Estoy utilizando Windows 8.1, y tenía que cambiar la ruta signtool.exe
  • estoy usando un archivo PFX y tenía que especificar la contraseña
  • no tenía necesidad de añadir toda la información que proporcionó

por favor, modifique los valores para "my_signing_file.pfx", "micontraseña", "myexe.exe" y para hacer este trabajo para usted:

<Target Name="SignOutput" AfterTargets="CoreCompile"> 
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)my_signing_file.pfx&quot; /p mypassword &quot;$(ProjectDir)obj\$(ConfigurationName)\myexe.exe&quot;" /> 
</Target> 
+0

¿A qué archivo va esto? –

+1

El archivo de proyecto (* .csproj) – BlueSky

1

Puede configurar el proceso de firma de la asamblea y el manifiesto de ClickOnce de VisualStudio:

  1. Haga clic derecho en su proyecto> propiedades> Firma.
  2. Marque "Firmar el Manifiesto de ClickOnce" y seleccione el certificado que desea utilizar.
  3. Marca "Firmar el conjunto" y selecciona el certificado que deseas utilizar.
  4. Guarde todos los cambios y publique de nuevo.

Todas estas configuraciones serán válidas cuando construya usando MsBuild.

Nota: Puede generar su certificado autofirmado desde esa pantalla si es necesario.

Nota 2: Recuerde que tiene DOS manifiestos "Manifiesto de aplicación" y "Manifiesto de implementación" ambos deben estar firmados con el mismo certificado.

Si necesita volver a firmar sus manifiestos en cualquier momento después de la compilación, puede usar Mage.exe.

Cuestiones relacionadas