我正在开发一个程序,该程序在打包到MSI部署项目之前需要对每个exe签名。我曾尝试使用VS2010的签名工具(“签署程序集”),但密钥文件似乎不喜欢VS2010。 VS不会要求输入密码或任何密码,也不会签署exe。所以,我一直在通过post-build命令行运行sign工具。
在我们太介入之前,我们应该看一下应用程序的当前结构(我无法控制它。我只是制作更新程序并尝试测试打包):
我在某处读到部署项目在另一个文件夹(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
。 (或者通常......有更好的方法吗?)答案 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)"
这样做会在成功构建后签名:
bin
目录下)obj
目录下)然后,最后,我没有任何可执行文件unsigned,这是我正在寻找的:)