如何以编程方式检测和定位Windows 10 SDK?

euoag5mw  于 12个月前  发布在  Windows
关注(0)|答案(4)|浏览(211)

TL;DR

是否有Windows注册表项(或其他易于编程的方式)来查找和检测适用于SDK V10.0的Windows SDK?
我正在做一些类似于this的事情,* 即 * 利用Windows 10 SDK附带的一些工具。
我正在寻找一个自动的方法来检测和定位Windows SDK.这项技术必须工作(至少)版本10.0(当前作为这个问题).最好,我想一个技术,适用于所有版本(和世界和平也会很好).
以前的版本(至少到V8.1A -如Visual Studio 2013所包含的)可以通过Windows注册表检测到。(尽管V<7.0 may not have been)。
对于64位安装:HKEY_LOCAL_MACHINE\SOFTWARE\Wow 6432 Node\Microsoft\Microsoft SDKs\Windows(注意与32位的粗体差异)。
而对于32位安装:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\WindowsHKEY_CURRENT_USER\SOFTWARE\Microsoft\Microsoft SDKs\Windows
(More在MSDN Windows SDK blog上)。

但是,V10.0(或Visual Studio 2015中包含的V10.0A)* 不 * 像以前的版本那样创建注册表项!

有一些技术using compiler macros可以 * 检测 * SDK版本。但是,这些技术对于SDK工具(xsd.exe等)来说并不实用,因为它们需要整个编译步骤-而且这不一定会产生SDK工具目录的路径!
理想情况下,这应该可以使用PowerShell或批处理脚本或其他一些可以包含在构建脚本或其他自动化环境中的简单方法来实现(它们毕竟是编程工具)。

注意:

  • 是的 * 有一些方法可以通过询问 * 文件系统 * 来做到这一点,(* 即 * 以编程方式列出%ProgramFiles(x86)%\Microsoft SDKs\Windows\的子目录,解析出'V'和'A'-s并选择列出的数字(10.0等)的max().
    **然而,这些方法有许多缺点:

1.相当笨重(文件系统访问、字符串解析等)
1.容易出错,一个空文件夹从一个不正确的SDK遗留可以刹车说笨重的目录解析。
1.取决于路径差异,按平台(* 即x64上的 * %ProgramFiles(x86)%,但32位上的%ProgramFiles%)和SDK版本; SDK<7将工具定位在Bin目录中,而SDK>7使用bin\NETFX X.X tools(注意“b”,只是为了增加不一致性)。
1.也取决于用户的安装选择(例如,“聪明的”sys admin将SDK安装在C:\Stuff\WinSDK\V10.0\中)。
因此,以编程方式实现这一点会好得多,例如通过注册表(如possible for previous Windows SDK versions
这个问题不是this one的重复,因为 this question 既询问了不同的SDK版本,也询问了查找SDK路径的编程(* 即 * 注册表等)方法。
它也不是this的重复,因为 * 那个问题 * 专门处理cmake,并且涉及构建号不匹配。

a2mppw5e

a2mppw5e1#

到目前为止,我发现的最好的方法是查看Visual Studio的dev命令是如何做到这一点的。目前(2019年),这在Visual Studio目录中的.\Common7\Tools\vsdevcmd\core\下的winsdk.bat中找到。如果将来再次更改,这应该会有所帮助。即使winsdk.bat被重命名或重新组织,希望仍然会包含类似的脚本。
在我的系统中,相关的部分目前看起来像这样:

:GetWin10SdkDir

call :GetWin10SdkDirHelper HKLM\SOFTWARE\Wow6432Node > nul 2>&1
if errorlevel 1 call :GetWin10SdkDirHelper HKCU\SOFTWARE\Wow6432Node > nul 2>&1
if errorlevel 1 call :GetWin10SdkDirHelper HKLM\SOFTWARE > nul 2>&1
if errorlevel 1 call :GetWin10SdkDirHelper HKCU\SOFTWARE > nul 2>&1
if errorlevel 1 exit /B 1
exit /B 0

:GetWin10SdkDirHelper

@REM `Get Windows 10 SDK installed folder`
for /F "tokens=1,2*" %%i in ('reg query "%1\Microsoft\Microsoft SDKs\Windows\v10.0" /v "InstallationFolder"') DO (
    if "%%i"=="InstallationFolder" (
        SET WindowsSdkDir=%%~k
    )
)

@REM `get windows 10 sdk version number`
setlocal enableDelayedExpansion

@REM `Due to the SDK installer changes beginning with the 10.0.15063.0 (RS2 SDK), there is a chance that the
@REM Windows SDK installed may not have the full set of bits required for all application scenarios.
@REM We check for the existence of a file we know to be included in the "App" and "Desktop" portions
@REM of the Windows SDK, depending on the Developer Command Prompt's -app_platform configuration.
@REM If "windows.h" (UWP) or "winsdkver.h" (Desktop) are not found, the directory will be skipped as
@REM a candidate default value for [WindowsSdkDir].`
set __check_file=winsdkver.h
if /I "%VSCMD_ARG_APP_PLAT%"=="UWP" set __check_file=Windows.h

if not "%WindowsSdkDir%"=="" for /f %%i IN ('dir "%WindowsSdkDir%include\" /b /ad-h /on') DO (
    @REM `Skip if Windows.h|winsdkver (based upon -app_platform configuration) is not found in %%i\um.`
    if EXIST "%WindowsSdkDir%include\%%i\um\%__check_file%" (
        set result=%%i
        if "!result:~0,3!"=="10." (
            set SDK=!result!
            if "!result!"=="%VSCMD_ARG_WINSDK%" set findSDK=1
        )
    )
)

字符串

koaltpgm

koaltpgm2#

我没有它的权威来源,但它可以追溯到Windows 10 SDK的卸载程序,并且它在我看过的几台机器上检查过:

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows Kits\Installed Roots
KitsRoot10="C:\Program Files (x86)\Windows Kits\10\"

字符串
准确的版本有点难以猜测,因为例如10.0.10150.010.0.10240.010.0.10586.0都是C:\Program Files (x86)\Windows Kits\10\Include下的子目录。

ctehm74n

ctehm74n3#

我的Windows Kits密钥不包含有关v10 Windows SDK的任何信息。但是,我在以下注册表路径中找到了有关它的信息:

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\NETFXSDK

字符串
在里面,有安装的.NET版本的子项。我有4.64.6.14.6.2
每个键都包含一个值InstallationFolder,它指向SDK安装的文件夹(这将是C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\),以及一个值KitsInstallationFolder,它包含包含库的工具包的路径(C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\)。
更有趣的是(至少对我来说),每个键还包含三个键:WinSDK-NetFx40ToolsWinSDK-NetFx40Tools-x64WinSDK-NetFx40Tools-x86。每个键都有一个值InstallationFolder,其中包含指定SDK版本的工具文件夹的绝对路径。
因此,对于我的用例,我现在在PowerShell中执行以下操作,以将文件夹获取到最新的SDK工具:

$WindowsSdkToolsPath = gci 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\NETFXSDK' |
    select -Last 1 |
    gci | ? { $_.PSChildName -eq 'WinSDK-NetFx40Tools' } |
    Get-ItemPropertyValue -Name InstallationFolder

mctunoxg

mctunoxg4#

自从这个问题第一次提出以来,Windows 10 SDK的安装方式可能已经更新,因为现在可以在注册表中找到该版本,

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0

字符串
属性为ProductVersion

相关问题