Skip to content
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
lib: find extensive Win10SDK installation
  • Loading branch information
mcdmaster committed Nov 13, 2020
commit 574677d068b0059e7b1efe25aa5415d1c42cf66b
64 changes: 55 additions & 9 deletions lib/Find-VisualStudio.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@
// See accompanying file LICENSE at https://github.com/node4good/windows-autoconf

// Usage:
// powershell -ExecutionPolicy Unrestricted -Command "Add-Type -Path Find-VisualStudio.cs; [VisualStudioConfiguration.Main]::PrintJson()"
// This script needs to be compatible with PowerShell v2 to run on Windows 2008R2 and Windows 7.

// powershell -ExecutionPolicy Unrestricted -Version "2.0" -Command "&{Add-Type -Path Find-VS2017.cs; [VisualStudioConfiguration.Main]::Query()}"
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace VisualStudioConfiguration
{
Expand Down Expand Up @@ -196,12 +195,13 @@ public static void PrintJson()
int pceltFetched;
ISetupInstance2[] rgelt = new ISetupInstance2[1];
List<string> instances = new List<string>();

while (true)
{
e.Next(1, rgelt, out pceltFetched);
if (pceltFetched <= 0)
{
Console.WriteLine(String.Format("[{0}]", string.Join(",", instances.ToArray())));
Console.Write(String.Format("[{0}]", string.Join(",", instances.ToArray())));
return;
}

Expand All @@ -216,6 +216,25 @@ public static void PrintJson()
}
}

private static string CheckInstance(ISetupPackageReference package)
{
// Visual Studio Community 2017 component directory:
// https://www.visualstudio.com/en-us/productinfo/vs2017-install-product-Community.workloads
String Win10SDKVer = null;

const string Win10SDKPrefix = "Microsoft.VisualStudio.Component.Windows10SDK.";
String id = package.GetId();
if (id.StartsWith(Win10SDKPrefix))
{
String[] parts = id.Substring(Win10SDKPrefix.Length).Split('.');
String foundSdkVer = parts[4];
Win10SDKVer = String.Compare(Win10SDKVer, foundSdkVer) > 0 ? Win10SDKVer : foundSdkVer;
return String.Format("{0}.{1}", id, Win10SDKVer);
}
// "Microsoft.VisualStudio.Component.Windows81SDK" as well
return id;
}

private static string JsonString(string s)
{
return "\"" + s.Replace("\\", "\\\\").Replace("\"", "\\\"") + "\"";
Expand All @@ -225,7 +244,6 @@ private static string InstanceJson(ISetupInstance2 setupInstance2)
{
// Visual Studio component directory:
// https://docs.microsoft.com/en-us/visualstudio/install/workload-and-component-ids

StringBuilder json = new StringBuilder();
json.Append("{");

Expand All @@ -238,13 +256,41 @@ private static string InstanceJson(ISetupInstance2 setupInstance2)
List<string> packages = new List<string>();
foreach (ISetupPackageReference package in setupInstance2.GetPackages())
{
string id = JsonString(package.GetId());
string id = JsonString(CheckInstance(package));
packages.Add(id);
}
json.Append(String.Format("\"packages\":[{0}]", string.Join(",", packages.ToArray())));
json.Append(String.Format("\"packages\":[{0}", string.Join(",", packages.ToArray())));

String jsonResultString = json.ToString();
if (!jsonResultString.Contains("Windows10SDK"))
{
System.Diagnostics.Process cmd = new System.Diagnostics.Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();

cmd.StandardInput.WriteLine("@echo off");
cmd.StandardInput.Flush();
cmd.StandardInput.WriteLine(
String.Format("{0}\\VC\\Auxiliary\\Build\\vcvarsall.bat x64", path)
);
cmd.StandardInput.Flush();
cmd.StandardInput.WriteLine("@echo %UCRTVersion%");
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();
String SDKFullText = cmd.StandardOutput.ReadToEnd();
int pos = SDKFullText.IndexOf("[Version ");
String SDKVersion = SDKFullText.Substring(pos + 14, 5);
json.Append(String.Format(",\"Microsoft.VisualStudio.Component.Windows10SDK.{0}\"", SDKVersion));
cmd.Close();
}
json.Append("]}");

json.Append("}");
return json.ToString();
}
}
}
}