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

时间:2013-05-01 18:48:43

标签: visual-studio-2010 code-signing post-build-event

我正在开发一个程序,该程序在打包到MSI部署项目之前需要对每个exe签名。我曾尝试使用VS2010的签名工具(“签署程序集”),但密钥文件似乎不喜欢VS2010。 VS不会要求输入密码或任何密码,也不会签署exe。所以,我一直在通过post-build命令行运行sign工具。

在我们太介入之前,我们应该看一下应用程序的当前结构(我无法控制它。我只是制作更新程序并尝试测试打包):

  • 父文件夹
    • 主要EXE项目文件夹
    • 更新程序EXE项目文件夹
    • 服务项目文件夹
    • 安装程序设置(卸载进程等)项目文件夹
    • 部署项目文件夹
    • 签署文件夹

我在某处读到部署项目在另一个文件夹(obj/x86/Release/app.exe而不是bin/Release)中生成exe。

我目前确保签署文件的方法是通过硬编码这样的路径:

"..\..\..\..\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 个答案:

答案 0 :(得分:3)

我的方法是在我的部署项目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#项目的Post-build事件中添加了以下行(Project> Properties> Build Events):

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#项目(bin目录下)
  2. 构建的EXE文件
  3. 我的部署项目使用的EXE文件为“主要输出”(在obj目录下)
  4. 最后是MSI包
  5. 然后,最后,我没有任何可执行文件unsigned,这是我正在寻找的:)