使用 Visual Studio 2012 时如何获取 SignTool.exe 的路径?
在 Visual Studio 2010 中,您可以使用
<Exec Command=""$(FrameworkSDKDir)bin\signtool.exe" sign /p ... />
其中 $(FrameworkSDKDir)
是
"c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\"
但在 Visual Studio 2012 中,$(FrameworkSDKDir)
是
"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\"
SignTool 位于
"c:\Program Files (x86)\Windows Kits\8.0\bin\x64\"
除了硬编码之外,还有其他方法可以获取此目录的路径吗(我尝试过 FrameworkSDKDir
和 WindowsSDKDir
,但两者都指向 v8.0A 目录)。
最佳答案
我刚刚遇到了同样的问题。从 Visual Studio 2012 命令提示符运行构建可行,但在 IDE 中失败。寻找详细或诊断日志使我找到了What is the default location for MSBuild logs? ,这告诉我 Visual Studio 无法提供我真正需要的诊断信息。
这就是我最终修复它的方法。
打开普通命令提示符(不是 Visual Studio 命令提示符),然后通过完全限定 MSBuild 的路径 (%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe) 来运行 msbuild。这最终给了我与 Visual Studio 2012 中收到的相同的错误消息(错误代码 9009)。
然后,通过附加/v:diag 开关,使用“诊断”日志记录(显示所有属性和项值)运行相同的构建。
从这个输出中,我了解到它确实有一些新属性,我可以使用它们来获取signtool.exe 的位置(摘录如下):
windir = C:\Windows
windows_tracing_flags = 3
windows_tracing_logfile = C:\BVTBin\Tests\installpackage\csilogfile.log
WindowsSDK80Path = C:\Program Files (x86)\Windows Kits\8.0\
WIX = C:\Program Files (x86)\WiX Toolset v3.7\
因此,我解决此问题的方法是将以下内容添加到我的 *.targets 文件中:
<SignToolPath Condition=" Exists('$(WindowsSDK80Path)bin\x86\signtool.exe') and '$(SignToolPath)'=='' and '$(PROCESSOR_ARCHITECTURE)'=='x86' ">$(WindowsSDK80Path)bin\x86\signtool.exe</SignToolPath>
<SignToolPath Condition=" Exists('$(WindowsSDK80Path)bin\x64\signtool.exe') and '$(SignToolPath)'=='' and '$(PROCESSOR_ARCHITECTURE)'=='AMD64' ">$(WindowsSDK80Path)bin\x64\signtool.exe</SignToolPath>
希望这对您也有帮助。我在序言中介绍了我是如何达到这一点的,因为还有其他可用的属性可能更适合您的目的。
关于msbuild - 使用 Visual Studio 2012 时 SignTool.exe 或 "Windows Kits"目录的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14082020/