From fda727171fe3100e7fdd01095f61fc8a76987dd0 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Tue, 16 Nov 2021 13:17:21 -0800 Subject: [PATCH] Always look in the 32-bit registry hive for the Windows SDK. --- src/msbuild/DNNE.BuildTasks/Windows.cs | 72 +++++++++++++------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/src/msbuild/DNNE.BuildTasks/Windows.cs b/src/msbuild/DNNE.BuildTasks/Windows.cs index df1fb64..74f4ec6 100644 --- a/src/msbuild/DNNE.BuildTasks/Windows.cs +++ b/src/msbuild/DNNE.BuildTasks/Windows.cs @@ -255,49 +255,51 @@ public int Compare(Version x, Version y) private static WinSDK GetLatestWinSDK() { - using (var kits = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows Kits\Installed Roots")) - { - string win10sdkRoot = (string)kits.GetValue("KitsRoot10"); + // Always use the 32-bit hive. + // See https://developercommunity.visualstudio.com/t/ucrt-doesnt-work-in-x64-msbuild/1184283#T-N1201257 + using var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32); + using var kits = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows Kits\Installed Roots"); - // Sort the entries in descending order as - // to defer to the latest version. - var versions = new SortedList(new VersionDescendingOrder()); + string win10sdkRoot = (string)kits.GetValue("KitsRoot10"); - // Collect the possible SDK versions. - foreach (var verMaybe in kits.GetSubKeyNames()) - { - if (!Version.TryParse(verMaybe, out Version versionMaybe)) - { - continue; - } + // Sort the entries in descending order as + // to defer to the latest version. + var versions = new SortedList(new VersionDescendingOrder()); - versions.Add(versionMaybe, verMaybe); + // Collect the possible SDK versions. + foreach (var verMaybe in kits.GetSubKeyNames()) + { + if (!Version.TryParse(verMaybe, out Version versionMaybe)) + { + continue; } - // Find the latest version of the SDK. - foreach (var tgtVerMaybe in versions) + versions.Add(versionMaybe, verMaybe); + } + + // Find the latest version of the SDK. + foreach (var tgtVerMaybe in versions) + { + // WinSDK inc and lib paths + var incDir = Path.Combine(win10sdkRoot, "Include", tgtVerMaybe.Value); + var libDir = Path.Combine(win10sdkRoot, "Lib", tgtVerMaybe.Value); + if (!Directory.Exists(incDir) || !Directory.Exists(libDir)) { - // WinSDK inc and lib paths - var incDir = Path.Combine(win10sdkRoot, "Include", tgtVerMaybe.Value); - var libDir = Path.Combine(win10sdkRoot, "Lib", tgtVerMaybe.Value); - if (!Directory.Exists(incDir) || !Directory.Exists(libDir)) - { - continue; - } + continue; + } - var sharedIncDir = Path.Combine(incDir, "shared"); - var umIncDir = Path.Combine(incDir, "um"); - var ucrtIncDir = Path.Combine(incDir, "ucrt"); - var umLibDir = Path.Combine(libDir, "um"); - var ucrtLibDir = Path.Combine(libDir, "ucrt"); + var sharedIncDir = Path.Combine(incDir, "shared"); + var umIncDir = Path.Combine(incDir, "um"); + var ucrtIncDir = Path.Combine(incDir, "ucrt"); + var umLibDir = Path.Combine(libDir, "um"); + var ucrtLibDir = Path.Combine(libDir, "ucrt"); - return new WinSDK() - { - Version = tgtVerMaybe.Value, - IncPaths = new[] { sharedIncDir, umIncDir, ucrtIncDir }, - LibPaths = new[] { umLibDir, ucrtLibDir }, - }; - } + return new WinSDK() + { + Version = tgtVerMaybe.Value, + IncPaths = new[] { sharedIncDir, umIncDir, ucrtIncDir }, + LibPaths = new[] { umLibDir, ucrtLibDir }, + }; } throw new Exception("No Win10 SDK version found.");