使用Visual Studio 2012时SignTool.exe或“Windows Kits”目录的path
如何在使用Visual Studio 2012时获得SignTool.exe的path?
在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\"
有没有一种方法获得这个目录的path,而不是硬编码(我试过FrameworkSDKDir
和WindowsSDKDir
,但都指向v8.0A目录)。
(我知道SignFile MSBuild任务,但我不能使用它,因为它不接受证书密码。)
我刚刚遇到了同样的问题。 从Visual Studio 2012命令提示符运行生成工作,但它在IDE中失败。 寻找一个详细的或诊断日志导致我什么是MSBuild日志的默认位置? ,它告诉我,Visual Studio不能提供我真正需要的诊断信息。
这是我最终做的修复它。
打开一个正常的命令提示符(不是Visual Studio命令提示符),并通过完全限定MSBuild(%SystemRoot%\ Microsoft.NET \ Framework \ v4.0.30319 \ MSBuild.exe)的path来运行msbuild。 这终于给了我一样的错误消息(错误代码9009),我已经在Visual Studio 2012中收到。
然后,通过附加/ v:diag开关,使用“诊断”日志logging(显示所有属性和项目值)运行相同的版本。
从这个输出中,我了解到它有一些新的属性可以用来获取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\
所以,我对这个问题的解决scheme是将以下内容添加到我的* .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>
希望这也能帮助你。 我包括了我如何得到这一点的序言,因为还有其他可用的属性可能更适合您的目的。
好的,因为这是第一次在谷歌search“在buildserver上找不到的SignTool.exe”,我将为VisualStudio 2015和Windows 10 Enterprise 64bit添加额外的信息。
我必须在VisualStudio安装程序中添加ClickOnce发布工具:
之后你会发现signtool.exe
- c:\ Program Files(x86)\ Windows Kits \ 8.1 \ bin \ x64 \
- c:\ Program Files(x86)\ Windows Kits \ 8.1 \ bin \ x86 \
- c:\ Program Files(x86)\ Windows Kits \ 8.1 \ bin \ arm \
以下是一个更通用的方法,可用于根据生成计算机的特定configuration来查找和设置SignToolPath
variables; 通过阅读registry:
<PropertyGroup> <WindowsKitsRoot>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot81', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot> <WindowsKitsRoot Condition="'$(WindowsKitsRoot)' == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot> <SignToolPath Condition="'$(SignToolPath)' == ''">$(WindowsKitsRoot)bin\$(Platform)\</SignToolPath> </PropertyGroup>
这假定$(Platform)
parsing为arm
, x86
或x64
。 将$(Platform)
macrosreplace为适当的目录,否则。
编辑 (2017.07.05):
这是一个更新的<PropertyGroup>
,它($Platform)=='AnyCPU'
新的Windows 10工具包,并($Platform)=='AnyCPU'
到x86
:
<PropertyGroup> <WindowsKitsRoot>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot10', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot> <WindowsKitsRoot Condition="'$(WindowsKitsRoot)' == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot81', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot> <WindowsKitsRoot Condition="'$(WindowsKitsRoot)' == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot> <SignToolPath Condition=" '$(SignToolPath)' == '' And '$(Platform)' == 'AnyCPU' ">$(WindowsKitsRoot)bin\x86\</SignToolPath> <SignToolPath Condition="'$(SignToolPath)' == ''">$(WindowsKitsRoot)bin\$(Platform)\</SignToolPath> </PropertyGroup>
Resolve-Path "C:\Program Files*\Windows Kits\*\bin\*\signtool.exe"
输出:
Path ---- C:\Program Files (x86)\Windows Kits\8.0\bin\x64\signtool.exe C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe C:\Program Files (x86)\Windows Kits\8.1\bin\arm\signtool.exe C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe C:\Program Files (x86)\Windows Kits\8.1\bin\x86\signtool.exe