// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System.IO;
using Microsoft.Win32;
namespace ICSharpCode.Decompiler.Tests.Helpers
{
public static class SdkUtility
{
static string GetPathFromRegistry(string key, string valueName)
{
using (RegistryKey installRootKey = Registry.LocalMachine.OpenSubKey(key))
{
if (installRootKey != null)
{
object o = installRootKey.GetValue(valueName);
if (o != null)
{
string r = o.ToString();
if (!string.IsNullOrEmpty(r))
return r;
}
}
}
return null;
}
static string GetPathFromRegistryX86(string key, string valueName)
{
using (RegistryKey baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
{
using (RegistryKey installRootKey = baseKey.OpenSubKey(key))
{
if (installRootKey != null)
{
object o = installRootKey.GetValue(valueName);
if (o != null)
{
string r = o.ToString();
if (!string.IsNullOrEmpty(r))
return r;
}
}
}
}
return null;
}
#region InstallRoot Properties
static string netFrameworkInstallRoot = null;
///
/// Gets the installation root of the .NET Framework (@"C:\Windows\Microsoft.NET\Framework\")
///
public static string NetFrameworkInstallRoot {
get {
if (netFrameworkInstallRoot == null)
{
netFrameworkInstallRoot = GetPathFromRegistry(@"SOFTWARE\Microsoft\.NETFramework", "InstallRoot") ?? string.Empty;
}
return netFrameworkInstallRoot;
}
}
static string netSdk20InstallRoot = null;
///
/// Location of the .NET 2.0 SDK install root.
///
public static string NetSdk20InstallRoot {
get {
if (netSdk20InstallRoot == null)
{
netSdk20InstallRoot = GetPathFromRegistry(@"SOFTWARE\Microsoft\.NETFramework", "sdkInstallRootv2.0") ?? string.Empty;
}
return netSdk20InstallRoot;
}
}
static string windowsSdk60InstallRoot = null;
///
/// Location of the .NET 3.0 SDK (Windows SDK 6.0) install root.
///
public static string WindowsSdk60InstallRoot {
get {
if (windowsSdk60InstallRoot == null)
{
windowsSdk60InstallRoot = GetPathFromRegistry(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0", "InstallationFolder") ?? string.Empty;
}
return windowsSdk60InstallRoot;
}
}
static string windowsSdk60aInstallRoot = null;
///
/// Location of the Windows SDK Components in Visual Studio 2008 (.NET 3.5; Windows SDK 6.0a).
///
public static string WindowsSdk60aInstallRoot {
get {
if (windowsSdk60aInstallRoot == null)
{
windowsSdk60aInstallRoot = GetPathFromRegistry(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0a", "InstallationFolder") ?? string.Empty;
}
return windowsSdk60aInstallRoot;
}
}
static string windowsSdk61InstallRoot = null;
///
/// Location of the .NET 3.5 SDK (Windows SDK 6.1) install root.
///
public static string WindowsSdk61InstallRoot {
get {
if (windowsSdk61InstallRoot == null)
{
windowsSdk61InstallRoot = GetPathFromRegistry(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.1", "InstallationFolder") ?? string.Empty;
}
return windowsSdk61InstallRoot;
}
}
static string windowsSdk70InstallRoot = null;
///
/// Location of the .NET 3.5 SP1 SDK (Windows SDK 7.0) install root.
///
public static string WindowsSdk70InstallRoot {
get {
if (windowsSdk70InstallRoot == null)
{
windowsSdk70InstallRoot = GetPathFromRegistry(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0", "InstallationFolder") ?? string.Empty;
}
return windowsSdk70InstallRoot;
}
}
static string windowsSdk71InstallRoot = null;
///
/// Location of the .NET 4.0 SDK (Windows SDK 7.1) install root.
///
public static string WindowsSdk71InstallRoot {
get {
if (windowsSdk71InstallRoot == null)
{
windowsSdk71InstallRoot = GetPathFromRegistry(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1", "InstallationFolder") ?? string.Empty;
}
return windowsSdk71InstallRoot;
}
}
static string windowsSdk80InstallRoot = null;
///
/// Location of the .NET 4.5 SDK (Windows SDK 8.0) install root.
///
public static string WindowsSdk80NetFxTools {
get {
if (windowsSdk80InstallRoot == null)
{
windowsSdk80InstallRoot = GetPathFromRegistryX86(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.0A\WinSDK-NetFx40Tools", "InstallationFolder") ?? string.Empty;
}
return windowsSdk80InstallRoot;
}
}
static string WindowsSdk461InstallRoot = null;
///
/// Location of the .NET 4.6.1 SDK install root.
///
public static string WindowsSdk461NetFxTools {
get {
if (WindowsSdk461InstallRoot == null)
{
WindowsSdk461InstallRoot = GetPathFromRegistryX86(@"SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\NETFXSDK\4.6.1\WinSDK-NetFx40Tools", "InstallationFolder") ?? string.Empty;
}
return WindowsSdk461InstallRoot;
}
}
#endregion
///
/// Searches all the .net sdk bin folders and return the path of the
/// exe from the latest sdk.
///
/// The EXE to search for.
/// The path of the executable, or null if the exe is not found.
public static string GetSdkPath(string exeName)
{
string execPath;
if (!string.IsNullOrEmpty(WindowsSdk461NetFxTools))
{
execPath = Path.Combine(WindowsSdk461NetFxTools, exeName);
if (File.Exists(execPath))
{ return execPath; }
}
if (!string.IsNullOrEmpty(WindowsSdk80NetFxTools))
{
execPath = Path.Combine(WindowsSdk80NetFxTools, exeName);
if (File.Exists(execPath))
{ return execPath; }
}
if (!string.IsNullOrEmpty(WindowsSdk71InstallRoot))
{
execPath = Path.Combine(WindowsSdk71InstallRoot, "bin\\" + exeName);
if (File.Exists(execPath))
{ return execPath; }
}
if (!string.IsNullOrEmpty(WindowsSdk70InstallRoot))
{
execPath = Path.Combine(WindowsSdk70InstallRoot, "bin\\" + exeName);
if (File.Exists(execPath))
{ return execPath; }
}
if (!string.IsNullOrEmpty(WindowsSdk61InstallRoot))
{
execPath = Path.Combine(WindowsSdk61InstallRoot, "bin\\" + exeName);
if (File.Exists(execPath))
{ return execPath; }
}
if (!string.IsNullOrEmpty(WindowsSdk60aInstallRoot))
{
execPath = Path.Combine(WindowsSdk60aInstallRoot, "bin\\" + exeName);
if (File.Exists(execPath))
{ return execPath; }
}
if (!string.IsNullOrEmpty(WindowsSdk60InstallRoot))
{
execPath = Path.Combine(WindowsSdk60InstallRoot, "bin\\" + exeName);
if (File.Exists(execPath))
{ return execPath; }
}
if (!string.IsNullOrEmpty(NetSdk20InstallRoot))
{
execPath = Path.Combine(NetSdk20InstallRoot, "bin\\" + exeName);
if (File.Exists(execPath))
{ return execPath; }
}
return null;
}
}
}