使用Visual Studio 2012时SignTool.exe或“Windows Kits”目录的path

如何在使用Visual Studio 2012时获得SignTool.exe的path?

在Visual Studio 2010中,您可以使用

<Exec Command="&quot;$(FrameworkSDKDir)bin\signtool.exe&quot; 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,而不是硬编码(我试过FrameworkSDKDirWindowsSDKDir ,但都指向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发布工具: Visual Studio 2015安装程序您可以添加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来查找和设置SignToolPathvariables; 通过阅读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为armx86x64 。 将$(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