项目的后构建事件输出路径和部署项目

3
我正在开发一个程序,在打包到MSI部署项目之前需要对每个exe进行签名。我尝试使用VS2010的签名工具(“签署程序集”),但密钥文件似乎不兼容VS2010。VS不要求输入密码,也没有对exe进行签名。因此,我一直在通过后置构建命令行运行签名工具。
在我们深入研究之前,我们应该先看一下应用程序的当前结构(我无法控制这个,我只是在制作更新程序并尝试测试打包):
- 父文件夹 - 主exe项目文件夹 - 更新程序exe项目文件夹 - 服务项目文件夹 - 安装设置(卸载进程等)项目文件夹 - 部署项目文件夹 - 签名文件文件夹
我在某个地方看到过,部署项目会将exe生成在不同的文件夹中(obj / x86 / Release / app.exe而不是bin / Release)。
我目前确保签名文件的方法是通过硬编码路径,像这样:
"......SigningFolder\signtool" sign /f "......SigningFolder\myKeyFile.p12" /p mypassword /t http://somecertsite.com "......Updater\Updater\obj\x86\Release\Updater.exe"
"......SigningFolder\signtool" sign /f "......SigningFolder\myKeyFile.p12" /p mypassword /t http://somecertsite.com "......Updater\Updater\bin\Release\Updater.exe"
这让我感到十分头痛。(每个exe文件都会发生这种情况,构建MSI之后,我也要签署MSI。)
因此,我的问题是:
- 是否有一种方法可以定位绝对输出路径?如果我使用$(OutDir),它在通过部署项目进行编译时指向bin \ Release。(或者通常情况下...是否有更好的方式来做到这一点?)
1个回答

4

我的方法是在部署项目的PostBuildEvent属性中添加以下行(假设我需要使用存储在智能卡上的证书(/a选项),并且无法通过环境变量确定signtool路径):

call "C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe" sign /a /d "$(SolutionName)" /q "$(BuiltOuputPath)"

这将为生成的MSI文件进行签名,但不会对内含的EXE文件进行签名。 为此,我还会在C#项目的“后期生成事件”(项目 > 属性 > 生成事件)中添加以下行:

call "C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe" sign /a /d "$(SolutionName)" /q "$(TargetDir)$(TargetFileName)" "$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)"

构建成功后,需要进行签名:

  1. 从我的C#项目中生成的EXE文件(位于bin目录下)
  2. 用作部署项目的“主要输出”所使用的EXE文件(位于obj目录下)
  3. 最后是MSI打包文件

这样,最终我就不会有未签名的可执行文件了,这正是我想要的 :)


1
对我来说,obj$(Configurationname) 解析为“Release”,但文件并没有放置在这个位置。(它放置在 x86 中) - teynon
2
我已经成功地让它工作了:call "..\..\..\path\signtool" sign /f "..\..\..\Signing Files\Signer.p12" /p xxxx /t http://certs.com "$(TargetDir)$(TargetFileName)" "$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)\$(TargetFileName)" - teynon
我在各处寻找这篇文章。非常感谢。 - mohammed mazin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接