在签署EXE时,“文件具有与清单中指定的计算哈希值不同”错误

我的ClickOnce安装失败并显示错误:

File,WindowsFormsProject.exe具有与manifest中指定的不同的计算哈希值。

我使用MSBuild生成ClickOnce部署包。 构建脚本中的相关行:

 

WindowsFormsProject.csproj具有签署可执行文件的Post-Build步骤,如下所示:

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

麻烦的是,当我查看构建日志时,我发现清单是在Post-Build事件执行之前生成的。 因此,哈希码不匹配也就不足为奇了。 构建日志中的相关行:

_CopyManifestFiles:

WindowsFormsProject – > … \ WindowsFormsProject.application

PostBuildEvent:

成功签名:… \ WindowsFormsProject.exe

所以,问题是:

  1. 在任务期间生成清单之前,有没有办法对程序集进行签名?
  2. 有没有办法在构建完成后重新生成清单(并且只显示清单),以便哈希代码再次匹配?

或者,如果你能想到问题的不同解决方案,我会很感激你的想法。

如果您使用的是MSBuild 4,则可以使用AfterTargets属性在创建后立即对程序集进行签名,然后再执行任何进一步的步骤。 删除构建后的步骤,并将此块添加到项目中:

   http://timestamp.verisign.com/scripts/timstamp.dll Foo bar /sha1 578a9486f10ed1118f2b5f428afb842e3f374793          

Dmitriy的答案归功于Dmitriy。 但是我不得不对德米特里的答案做一些改变,让它对我有用。 特别:

  • 我为“Target”添加了一个结束标记
  • 我使用的是Windows 8.1,不得不更改signtool.exe路径
  • 我正在使用PFX文件,必须指定密码
  • 我不需要添加他提供的所有信息

请修改“my_signing_file.pfx”,“mypassword”,“myexe.exe”的值,并使其适合您:

    

您可以从VisualStudio配置程序集的签名过程和ClickOnce清单:

  1. 右键单击项目>属性>签名。
  2. 选中“签署ClickOnce Manifest”并选择要使用的证书。
  3. 选中“签署程序集”并选择要使用的证书。
  4. 保存所有更改并再次发布。

使用MsBuild构建时,所有这些设置都将有效。

注意:如果需要,您可以从该屏幕生成自签名证书。

注意2:请记住,您有两个清单“Application Manifest”和“Deployment Manifest”都必须使用相同的证书进行签名。

如果您需要在构建后随时重新签署清单,则可以使用Mage.exe 。