Rya*_*yan 41 msbuild signtool visual-studio-2012
使用Visual Studio 2012时,如何获得SignTool.exe的路径?
在Visual Studio 2010中,您可以使用
<Exec Command=""$(FrameworkSDKDir)bin\signtool.exe" sign /p ... />
Run Code Online (Sandbox Code Playgroud)
哪里$(FrameworkSDKDir)是
"c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\"
Run Code Online (Sandbox Code Playgroud)
但在Visual Studio 2012中,$(FrameworkSDKDir)是
"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\"
Run Code Online (Sandbox Code Playgroud)
和SignTool在
"c:\Program Files (x86)\Windows Kits\8.0\bin\x64\"
Run Code Online (Sandbox Code Playgroud)
有越来越路径不是硬编码等这个目录的方式(我试过FrameworkSDKDir和WindowsSDKDir,但都指向v8.0A目录).
小智 42
我刚遇到同样的问题.从Visual Studio 2012命令提示符运行构建工作,但它在IDE中失败.寻找详细或诊断日志让我了解MSBuild日志的默认位置是什么?,它告诉我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\
Run Code Online (Sandbox Code Playgroud)
所以,我对这个问题的解决方案是将以下内容添加到我的*.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>
Run Code Online (Sandbox Code Playgroud)
希望这对你也有帮助.我列出了我如何达到这一点的序言,因为有其他可用的属性可能更适合您的目的.
gRe*_*ReX 16
好的,因为这是google上第一个"在buildserver上找不到SignTool.exe",我将为VisualStudio 2015和Windows 10 Enterprise 64bit添加额外的信息.
我必须在VisualStudio安装程序中添加ClickOnce发布工具:

在此之后你会找到signtool.exe
随着Visual Studio的2017年安装了它在发现
使用Visual Studio 2017 15.7.4,Path根据您安装的所选Windows 10 Kit再次更改.
通过启动Visual Studio 2017的开发人员命令提示符,您将获得路径通用

并输入
where signtool.exe
erg*_*ack 12
以下是一种更通用的方法,可用于SignToolPath根据构建机器的特定配置查找和设置变量; 通过阅读注册表:
<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>
Run Code Online (Sandbox Code Playgroud)
这是假定$(Platform)解析为一个arm,x86或x64.请用$(Platform)适当的目录替换宏.
编辑(2017.07.05):
这是一个更新<PropertyGroup>,推迟到新的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>
Run Code Online (Sandbox Code Playgroud)
Resolve-Path "C:\Program Files*\Windows Kits\*\bin\*\signtool.exe"
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
因为对我来说,今天(20/07/2020),之前的所有建议都失败了,尽管其中大多数在过去都有效,但我决定发布一个更全面的方法,该方法还解决了以后的 Windows 10 SDK 位置,同时仍然使用旧版本作为后备。
<PropertyGroup Label="UserDefinedVariables">
<!-- Get Windows SDK root folder-->
<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>
<!-- Evaluates the most recent Windows SDK folder containing SignTool.exe -->
<!-- add new versions here, duplicating following line -->
<SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.18362.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.18362.0\x64\</SignToolFolder>
<SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.17763.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.17763.0\x64\</SignToolFolder>
<SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.17134.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.17134.0\x64\</SignToolFolder>
<SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.16299.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.16299.0\x64\</SignToolFolder>
<SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.15063.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.15063.0\x64\</SignToolFolder>
<SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.14393.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.14393.0\x64\</SignToolFolder>
<SignToolFolder Condition="'$(SignToolFolder)' == '' And '$(Platform)' == 'AnyCPU' ">$(WindowsKitsRoot)bin\x64\</SignToolFolder>
<SignToolFolder Condition="'$(SignToolFolder)' == ''">$(WindowsKitsRoot)bin\$(Platform)\</SignToolFolder>
<!-- Now we should be able to calculate SignTool.exe fullpath -->
<SignToolExe Condition=" '$(SignToolFolder)' != '' ">$(SignToolFolder)SignTool.exe</SignToolExe>
</PropertyGroup>
<!-- Finally, I would suggest you add the following lines to your project file because they will be quite usefull when things go wrong (and they will) -->
<!-- Send indivual compile bessages to MSBuild output so you check the value of each variable -->
<Target Name="ShowUserDefinedVariables" BeforeTargets="BeforeBuild">
<Message Importance="High" Text="WindowsKitsRoot = $(WindowsKitsRoot)" />
<Message Importance="High" Text="SignToolFolder = $(SignToolFolder)" />
<Message Importance="High" Text="SignToolExe = $(SignToolExe)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39847 次 |
| 最近记录: |