在签署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
所以,问题是:
- 在任务期间生成清单之前,有没有办法对程序集进行签名?
- 有没有办法在构建完成后重新生成清单(并且只显示清单),以便哈希代码再次匹配?
或者,如果你能想到问题的不同解决方案,我会很感激你的想法。
如果您使用的是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清单:
- 右键单击项目>属性>签名。
- 选中“签署ClickOnce Manifest”并选择要使用的证书。
- 选中“签署程序集”并选择要使用的证书。
- 保存所有更改并再次发布。
使用MsBuild构建时,所有这些设置都将有效。
注意:如果需要,您可以从该屏幕生成自签名证书。
注意2:请记住,您有两个清单“Application Manifest”和“Deployment Manifest”都必须使用相同的证书进行签名。
如果您需要在构建后随时重新签署清单,则可以使用Mage.exe 。