2012-09-20 9 views
6

La mia installazione ClickOnce ha esito negativo con un errore:"File ha un diverso hash calcolato quanto specificato nel manifesto" l'errore al momento della firma il file EXE

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

Io uso MSBuild per generare pacchetto di distribuzione ClickOnce. La linea in questione dal script di build:

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

Il WindowsFormsProject.csproj ha un post-generazione passo che firma l'eseguibile, come segue:

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

Il problema è che quando guardo la build log Vedo che il manifest è generato PRIMA che l'evento Post-Build venga eseguito. Quindi non sorprende che i codici hash non corrispondano. Le linee interessate dal log di compilazione:

_CopyManifestFiles:

WindowsFormsProject -> ...\WindowsFormsProject.application

...

PostBuildEvent:

Successfully signed: ...\WindowsFormsProject.exe

Quindi, le domande sono:

  1. Esiste un modo per firmare l'assembly PRIMA manifesto viene generato durante la MSBuild > compito <?
  2. C'è un modo per rigenerare il manifest (e manifest solo) dopo che la compilazione è completa in modo che i codici hash corrispondano di nuovo?

Oppure, se riesci a pensare a una soluzione diversa al problema, apprezzerei le tue idee.

risposta

8

Se si utilizza MSBuild 4, è possibile utilizzare la proprietà AfterTargets per firmare l'assembly subito dopo la sua creazione e prima che vengano eseguiti ulteriori passaggi. Rimuovi il tuo passaggio post-build e aggiungi questo blocco al tuo progetto:

<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

Nel caso qualcuno faccia lo stesso errore che ho fatto ... Ho interpretato questa risposta 'Postbuild' con' Target'. Questo non è corretto 'Target' dovrebbe essere a livello di progetto. –

3

Il credito va a Dmitriy per la sua risposta. Tuttavia ho dovuto apportare lievi modifiche alla risposta di Dmitry per farlo funzionare per me. In particolare:

  • ho aggiunto un tag di chiusura per "Target"
  • Sto usando Windows 8.1, e ho dovuto cambiare il percorso SignTool.exe
  • Sto usando un file PFX e dovuto specificare la password
  • non ho bisogno di aggiungere tutte le informazioni ha fornito

si prega di modificare i valori per "my_signing_file.pfx", "mypassword", "MYEXE.EXE" e per fare questo lavoro per voi:

<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

In che file va questo? –

+1

Il file di progetto (* .csproj) – BlueSky

1

È possibile configurare il processo di firma del gruppo e il manifesto ClickOnce da VisualStudio:

  1. clic destro del progetto> proprietà> Firma.
  2. Selezionare "Firma il ClickOnce Manifest" e selezionare il certificato che si desidera utilizzare.
  3. Selezionare "Firma l'assemblaggio" e selezionare il certificato che si desidera utilizzare.
  4. Salvare tutte le modifiche e pubblicare di nuovo.

Tutte queste impostazioni saranno valide quando si crea utilizzando MsBuild.

Nota: Se necessario, è possibile generare il proprio certificato autofirmato da tale schermata.

Nota 2: Ricordare che si hanno DUE manifesti "Manifestazione applicazione" e "Manifestazione distribuzione" entrambi devono essere firmati con lo stesso certificato.

Se è necessario ri-firmare i manifesti in qualsiasi momento dopo la compilazione, è possibile utilizzare Mage.exe.

Problemi correlati