发布时在 clickonce 应用程序中签署可执行文件

Posted

技术标签:

【中文标题】发布时在 clickonce 应用程序中签署可执行文件【英文标题】:Sign executable within a clickonce application when publishing 【发布时间】:2016-02-19 16:58:43 【问题描述】:

我在 Visual Studio 2013 中有一个 c# .net 项目。我已成功签署清单,告诉 Visual Studio 也签署程序集。

但是应用程序 exe 文件没有被签名。谷歌搜索后,我在构建后事件中添加了以下内容

"C:\Program Files\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /f "$(ProjectDir)certificate.pfx" /p mypassword "$(ProjectDir)obj\Debug\myapp.exe"

也试过了

"C:\Program Files\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /f "$(ProjectDir)certificate.pfx" /p mypassword "$(ProjectDir)bin\Debug\myapp.exe"

这似乎签署了 exe,但是现在我的应用程序将无法启动并给出错误:

文件 ECG Cloud Holter Assistant.exe 具有不同的计算哈希值 比清单中指定的要多。

所以我认为我需要它在生成清单之前 对 exe 进行签名,但我该怎么做呢?

如果我不包含 post build 命令,应用程序运行正常,但会出现未知发布者警告。

【问题讨论】:

这是一个偶然的 WPF 项目吗? 签署清单应该是构建过程的最后一步。在您的情况下,您在签署清单后修改 exe 文件。 Ageonix - 这是一个 winform 应用程序。 Nicolay - 是的,这就是我所观察到的。我想知道如何在构建后但在创建清单之前签署 exe。 【参考方案1】:

尝试一下: 1.右键单击winforms项目并选择“卸载项目”。 2.再次右键项目,选择“Edit (yourprojectname).csproj”。 3. 转到文件底部,在关闭“项目”标签之前添加以下部分:

<Target Name="AfterCompile">
   <Exec Command="C:\Program Files\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /f "$(ProjectDir)certificate.pfx" /p mypassword "$(ProjectDir)obj\Debug\myapp.exe" />
</Target>

4。保存 proj 文件并关闭它。 5. 再次右键单击该项目并重新加载它。 现在,如果您构建您的项目,您将不会在输出窗口中看到任何有关签署应用程序可执行文件的信息。只有在您发布时它才会这样做,并且不会记录让您知道它已签名。你怎么知道它是否有效?转到您发布到的文件夹,然后查看 Application Files 文件夹。在新版本的文件夹中找到应用程序可执行文件。右键单击它,选择属性。寻找一个名为“数字签名”的选项卡。如果未找到,则未签名。如果您确实看到它,请转到该选项卡;它将显示签名列表和证书的签名者。您可以双击签名者,然后查看签名证书。 我遇到了类似的问题,并在这篇博文的帮助下解决了这个问题:https://robindotnet.wordpress.com/2013/02/24/windows-8-and-clickonce-the-definitive-answer-2/

【讨论】:

谢谢,效果很好。要记住的主要内容是“AfterCompile”——robindotnet 文章中使用的“BeforePublish”对我不起作用。 CommandExec 标签的一个属性。所以它的值应该用引号引起来。但是 signtool.exe 之后的双引号是否不打算引用路径(因为它包含空格)?如果这是正确的,这是一个奇怪的语法约定。我在属性中使用了单引号,并在内部使用双引号来确定。

以上是关于发布时在 clickonce 应用程序中签署可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

Clickonce 未找到部署外部 dll 引用

clickonce中需要Microsoft.SqlServer.Management.SqlParser

ClickOnce管理员启动并且支持ClickOnce更新

ClickOnce部署Winform程序的方方面面

C# clickonce用处

MSBuild 未生成发布网页 (ClickOnce)