diff --git a/ref/Microsoft.Build.Utilities.Core/net/Microsoft.Build.Utilities.Core.cs b/ref/Microsoft.Build.Utilities.Core/net/Microsoft.Build.Utilities.Core.cs index e435979d2b2..a8564cf317b 100644 --- a/ref/Microsoft.Build.Utilities.Core/net/Microsoft.Build.Utilities.Core.cs +++ b/ref/Microsoft.Build.Utilities.Core/net/Microsoft.Build.Utilities.Core.cs @@ -600,5 +600,7 @@ public enum VisualStudioVersion Version140 = 3, Version150 = 4, VersionLatest = 4, + Version160 = 5, + Version170 = 6, } } diff --git a/ref/Microsoft.Build.Utilities.Core/netstandard/Microsoft.Build.Utilities.Core.cs b/ref/Microsoft.Build.Utilities.Core/netstandard/Microsoft.Build.Utilities.Core.cs index d77c4295057..9d7111dfe72 100644 --- a/ref/Microsoft.Build.Utilities.Core/netstandard/Microsoft.Build.Utilities.Core.cs +++ b/ref/Microsoft.Build.Utilities.Core/netstandard/Microsoft.Build.Utilities.Core.cs @@ -434,5 +434,7 @@ public enum VisualStudioVersion Version140 = 3, Version150 = 4, VersionLatest = 4, + Version160 = 5, + Version170 = 6, } } diff --git a/src/Shared/FrameworkLocationHelper.cs b/src/Shared/FrameworkLocationHelper.cs index 006e0587bf1..e567fc1f64c 100644 --- a/src/Shared/FrameworkLocationHelper.cs +++ b/src/Shared/FrameworkLocationHelper.cs @@ -66,9 +66,11 @@ internal static class FrameworkLocationHelper internal static readonly Version visualStudioVersion120 = new Version(12, 0); internal static readonly Version visualStudioVersion140 = new Version(14, 0); internal static readonly Version visualStudioVersion150 = new Version(15, 0); + internal static readonly Version visualStudioVersion160 = new Version(16, 0); + internal static readonly Version visualStudioVersion170 = new Version(17, 0); // keep this up-to-date; always point to the latest visual studio version. - internal static readonly Version visualStudioVersionLatest = visualStudioVersion150; + internal static readonly Version visualStudioVersionLatest = visualStudioVersion160; private const string dotNetFrameworkRegistryPath = "SOFTWARE\\Microsoft\\.NETFramework"; private const string dotNetFrameworkSetupRegistryPath = "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP"; @@ -286,6 +288,25 @@ internal static class FrameworkLocationHelper dotNetFrameworkVersion472, dotNetFrameworkVersion48, }), + + // VS16 + new VisualStudioSpec(visualStudioVersion160, "NETFXSDK\\{0}", "v10.0", "InstallationFolder", new [] + { + dotNetFrameworkVersion11, + dotNetFrameworkVersion20, + dotNetFrameworkVersion35, + dotNetFrameworkVersion40, + dotNetFrameworkVersion45, + dotNetFrameworkVersion451, + dotNetFrameworkVersion452, + dotNetFrameworkVersion46, + dotNetFrameworkVersion461, + dotNetFrameworkVersion462, + dotNetFrameworkVersion47, + dotNetFrameworkVersion471, + dotNetFrameworkVersion472, + dotNetFrameworkVersion48, + }), }; #if FEATURE_WIN32_REGISTRY @@ -320,6 +341,17 @@ internal static class FrameworkLocationHelper { (dotNetFrameworkVersion471, visualStudioVersion150), (dotNetFrameworkVersion47, visualStudioVersion150) }, { (dotNetFrameworkVersion472, visualStudioVersion150), (dotNetFrameworkVersion471, visualStudioVersion150) }, { (dotNetFrameworkVersion48, visualStudioVersion150), (dotNetFrameworkVersion472, visualStudioVersion150) }, + + // VS16 + { (dotNetFrameworkVersion451, visualStudioVersion160), (dotNetFrameworkVersion45, visualStudioVersion160) }, + { (dotNetFrameworkVersion452, visualStudioVersion160), (dotNetFrameworkVersion451, visualStudioVersion160) }, + { (dotNetFrameworkVersion46, visualStudioVersion160), (dotNetFrameworkVersion451, visualStudioVersion160) }, + { (dotNetFrameworkVersion461, visualStudioVersion160), (dotNetFrameworkVersion46, visualStudioVersion160) }, + { (dotNetFrameworkVersion462, visualStudioVersion160), (dotNetFrameworkVersion461, visualStudioVersion160) }, + { (dotNetFrameworkVersion47, visualStudioVersion160), (dotNetFrameworkVersion462, visualStudioVersion160) }, + { (dotNetFrameworkVersion471, visualStudioVersion160), (dotNetFrameworkVersion47, visualStudioVersion160) }, + { (dotNetFrameworkVersion472, visualStudioVersion160), (dotNetFrameworkVersion471, visualStudioVersion160) }, + { (dotNetFrameworkVersion48, visualStudioVersion160), (dotNetFrameworkVersion472, visualStudioVersion160) }, }; #endif // FEATURE_WIN32_REGISTRY diff --git a/src/Tasks.UnitTests/ResourceHandling/GenerateResourceOutOfProc_Tests.cs b/src/Tasks.UnitTests/ResourceHandling/GenerateResourceOutOfProc_Tests.cs index 3c304324122..6d055df7140 100644 --- a/src/Tasks.UnitTests/ResourceHandling/GenerateResourceOutOfProc_Tests.cs +++ b/src/Tasks.UnitTests/ResourceHandling/GenerateResourceOutOfProc_Tests.cs @@ -3015,7 +3015,7 @@ public static GenerateResource CreateTaskOutOfProc(ITestOutputHelper output) { GenerateResource t = CreateTask(output); t.ExecuteAsTool = true; - t.SdkToolsPath = ToolLocationHelper.GetPathToDotNetFrameworkSdk(TargetDotNetFrameworkVersion.VersionLatest); + t.SdkToolsPath = ToolLocationHelper.GetPathToDotNetFrameworkSdk(TargetDotNetFrameworkVersion.Version48); return t; } diff --git a/src/Tasks/GenerateResource.cs b/src/Tasks/GenerateResource.cs index 7a3ad571bda..bc15a0328a1 100644 --- a/src/Tasks/GenerateResource.cs +++ b/src/Tasks/GenerateResource.cs @@ -1065,13 +1065,20 @@ private bool ComputePathToResGen() if (String.IsNullOrEmpty(_sdkToolsPath)) { - _resgenPath = ToolLocationHelper.GetPathToDotNetFrameworkSdkFile("resgen.exe", TargetDotNetFrameworkVersion.Version35); + // Important: the GenerateResource task is declared twice in Microsoft.Common.CurrentVersion.targets: + // https://github.com/dotnet/msbuild/blob/369631b4b21ef485f4d6f35e16b0c839a971b0e9/src/Tasks/Microsoft.Common.CurrentVersion.targets#L3177-L3178 + // First for CLR >= 4.0, where SdkToolsPath is passed $(ResgenToolPath) which in turn is set to + // $(TargetFrameworkSDKToolsDirectory). + // But for CLR < 4.0 the SdkToolsPath is not passed, so we need to explicitly assume 3.5: + var version = TargetDotNetFrameworkVersion.Version35; + + _resgenPath = ToolLocationHelper.GetPathToDotNetFrameworkSdkFile("resgen.exe", version); if (_resgenPath == null && ExecuteAsTool) { Log.LogErrorWithCodeFromResources("General.PlatformSDKFileNotFound", "resgen.exe", - ToolLocationHelper.GetDotNetFrameworkSdkInstallKeyValue(TargetDotNetFrameworkVersion.Version35), - ToolLocationHelper.GetDotNetFrameworkSdkRootRegistryKey(TargetDotNetFrameworkVersion.Version35)); + ToolLocationHelper.GetDotNetFrameworkSdkInstallKeyValue(version), + ToolLocationHelper.GetDotNetFrameworkSdkRootRegistryKey(version)); } } else diff --git a/src/Utilities/ToolLocationHelper.cs b/src/Utilities/ToolLocationHelper.cs index d2473b7f3e5..1b6d83c2caa 100644 --- a/src/Utilities/ToolLocationHelper.cs +++ b/src/Utilities/ToolLocationHelper.cs @@ -130,30 +130,40 @@ public enum TargetDotNetFrameworkVersion public enum VisualStudioVersion { /// - /// Visual Studio 2010 and SP1 + /// Visual Studio 2010 (Dev10) and SP1 /// Version100, /// - /// Visual Studio Dev11 + /// Visual Studio 2012 (Dev11) /// Version110, /// - /// Visual Studio Dev12 + /// Visual Studio 2013 (Dev12) /// Version120, /// - /// Visual Studio Dev14 + /// Visual Studio 2015 (Dev14) /// Version140, /// - /// Visual Studio Dev15 + /// Visual Studio 2017 (Dev15) /// Version150, + /// + /// Visual Studio 2019 (Dev16) + /// + Version160, + + /// + /// Visual Studio "Dev17" + /// + Version170, + // keep this up-to-date; always point to the last entry. /// /// The latest version available at the time of release @@ -2052,26 +2062,22 @@ private static Version TargetDotNetFrameworkVersionToSystemVersion(TargetDotNetF private static Version VisualStudioVersionToSystemVersion(VisualStudioVersion version) { - switch (version) + return version switch { - case VisualStudioVersion.Version100: - return FrameworkLocationHelper.visualStudioVersion100; - - case VisualStudioVersion.Version110: - return FrameworkLocationHelper.visualStudioVersion110; - - case VisualStudioVersion.Version120: - return FrameworkLocationHelper.visualStudioVersion120; - - case VisualStudioVersion.Version140: - return FrameworkLocationHelper.visualStudioVersion140; - - case VisualStudioVersion.Version150: - return FrameworkLocationHelper.visualStudioVersion150; + VisualStudioVersion.Version100 => FrameworkLocationHelper.visualStudioVersion100, + VisualStudioVersion.Version110 => FrameworkLocationHelper.visualStudioVersion110, + VisualStudioVersion.Version120 => FrameworkLocationHelper.visualStudioVersion120, + VisualStudioVersion.Version140 => FrameworkLocationHelper.visualStudioVersion140, + VisualStudioVersion.Version150 => FrameworkLocationHelper.visualStudioVersion150, + VisualStudioVersion.Version160 => FrameworkLocationHelper.visualStudioVersion160, + VisualStudioVersion.Version170 => FrameworkLocationHelper.visualStudioVersion170, + _ => Unsupported() + }; - default: - ErrorUtilities.ThrowArgument("ToolLocationHelper.UnsupportedVisualStudioVersion", version); - return null; + Version Unsupported() + { + ErrorUtilities.ThrowArgument("ToolLocationHelper.UnsupportedVisualStudioVersion", version); + return null; } } @@ -3250,7 +3256,8 @@ internal static string ChainReferenceAssemblyPath(string targetFrameworkDirector /// /// File name to locate in the .NET Framework SDK directory /// Path string. - public static string GetPathToDotNetFrameworkSdkFile(string fileName) => GetPathToDotNetFrameworkSdkFile(fileName, TargetDotNetFrameworkVersion.Latest); + public static string GetPathToDotNetFrameworkSdkFile(string fileName) + => GetPathToDotNetFrameworkSdkFile(fileName, TargetDotNetFrameworkVersion.Latest); /// /// Get a fully qualified path to a file in the .NET Framework SDK. Error if the .NET Framework SDK can't be found. @@ -3261,7 +3268,8 @@ internal static string ChainReferenceAssemblyPath(string targetFrameworkDirector /// File name to locate in the .NET Framework SDK directory /// Version of the targeted .NET Framework /// Path string. - public static string GetPathToDotNetFrameworkSdkFile(string fileName, TargetDotNetFrameworkVersion version) => GetPathToDotNetFrameworkSdkFile(fileName, version, VisualStudioVersion.VersionLatest); + public static string GetPathToDotNetFrameworkSdkFile(string fileName, TargetDotNetFrameworkVersion version) + => GetPathToDotNetFrameworkSdkFile(fileName, version, VisualStudioVersion.VersionLatest); /// /// Get a fully qualified path to a file in the .NET Framework SDK. Error if the .NET Framework SDK can't be found. @@ -3276,7 +3284,7 @@ public static string GetPathToDotNetFrameworkSdkFile(string fileName, TargetDotN version, visualStudioVersion, UtilitiesDotNetFrameworkArchitecture.Current, - true /* If the file is not found for the current architecture, it's OK to follow fallback mechanisms. */ + canFallBackIfNecessary: true /* If the file is not found for the current architecture, it's OK to follow fallback mechanisms. */ ); ///