diff --git a/Directory.Packages.props b/Directory.Packages.props index 117d0ddf276..2de8bea8769 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -45,6 +45,7 @@ + diff --git a/eng/Version.Details.props b/eng/Version.Details.props index 767ed27248d..4878a8da60b 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -6,23 +6,23 @@ This file should be imported by eng/Versions.props - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 - 9.0.11 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 + 10.0.1 10.0.0-beta.26062.3 10.0.0-beta.26062.3 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5edaf003cba..7781f752293 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -3,103 +3,103 @@ - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime - + https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index fb60b6444c5..b13f1b3c952 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -48,9 +48,10 @@ However, we can update, binding-redirect to, and distribute the newest version (that matches the VS-referenced versions) in order to get the benefits of updating. See uses of $(UseFrozenMaintenancePackageVersions) for details. --> - 4.6.0 - 6.1.0 - 4.6.0 + 4.6.3 + 6.1.2 + 4.6.3 + 4.6.1 @@ -80,7 +81,7 @@ - 10.0.100 + 10.0.101 diff --git a/src/Build.UnitTests/TaskHostFactoryLifecycle_E2E_Tests.cs b/src/Build.UnitTests/TaskHostFactoryLifecycle_E2E_Tests.cs index c67a5ab1a12..b82ca9693ba 100644 --- a/src/Build.UnitTests/TaskHostFactoryLifecycle_E2E_Tests.cs +++ b/src/Build.UnitTests/TaskHostFactoryLifecycle_E2E_Tests.cs @@ -22,10 +22,15 @@ namespace Microsoft.Build.Engine.UnitTests /// public class TaskHostFactoryLifecycle_E2E_Tests { - private static string AssemblyLocation { get; } = Path.Combine(Path.GetDirectoryName(typeof(TaskHostFactoryLifecycle_E2E_Tests).Assembly.Location) ?? System.AppContext.BaseDirectory); + private static string AssemblyLocation { get; } = Path.Combine(Path.GetDirectoryName(typeof(TaskHostFactoryLifecycle_E2E_Tests).Assembly.Location) ?? AppContext.BaseDirectory); private static string TestAssetsRootPath { get; } = Path.Combine(AssemblyLocation, "TestAssets", "TaskHostLifecycle"); + private const string TaskHostFactory = "TaskHostFactory"; + private const string AssemblyTaskFactory = "AssemblyTaskFactory"; + private const string CurrentRuntime = "CurrentRuntime"; + private const string NetRuntime = "NET"; + private readonly ITestOutputHelper _output; public TaskHostFactoryLifecycle_E2E_Tests(ITestOutputHelper output) @@ -46,74 +51,71 @@ public TaskHostFactoryLifecycle_E2E_Tests(ITestOutputHelper output) /// The task factory to use (TaskHostFactory or AssemblyTaskFactory) [Theory] #if NET - [InlineData("CurrentRuntime", "AssemblyTaskFactory")] // Match + No Explicit → in-proc - [InlineData("CurrentRuntime", "TaskHostFactory")] // Match + Explicit → short-lived out-of-proc + [InlineData(CurrentRuntime, AssemblyTaskFactory)] // Match + No Explicit → in-proc + [InlineData(CurrentRuntime, TaskHostFactory)] // Match + Explicit → short-lived out-of-proc #endif - [InlineData("NET", "AssemblyTaskFactory")] // No Match + No Explicit → long-lived sidecar out-of-proc - [InlineData("NET", "TaskHostFactory")] // No Match + Explicit → short-lived out-of-proc + [InlineData(NetRuntime, AssemblyTaskFactory)] // No Match + No Explicit → long-lived sidecar out-of-proc + [InlineData(NetRuntime, TaskHostFactory)] // No Match + Explicit → short-lived out-of-proc public void TaskHostLifecycle_ValidatesAllScenarios( string runtimeToUse, string taskFactoryToUse) { - bool? expectedNodeReuse; + bool? expectedNodeReuse = DetermineExpectedNodeReuse(runtimeToUse, taskFactoryToUse); - // TaskHostFactory is always short lived and out-of-proc - if (taskFactoryToUse == "TaskHostFactory") - { - expectedNodeReuse = false; - } - // AssemblyTaskFactory behavior depends on runtime - else if (taskFactoryToUse == "AssemblyTaskFactory") - { - if (runtimeToUse == "CurrentRuntime") - { - // in-proc - expectedNodeReuse = null; - } - else if (runtimeToUse == "NET") - { - // When running on .NET Framework: out-of-proc, otherwise on .NET in-proc. - expectedNodeReuse = RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework", StringComparison.OrdinalIgnoreCase) ? true : null; - } - else - { - throw new ArgumentOutOfRangeException(nameof(runtimeToUse), "Unknown runtime to use: " + runtimeToUse); - } - } - else + using TestEnvironment env = TestEnvironment.Create(_output); + + string buildOutput = ExecuteBuildWithTaskHost(runtimeToUse, taskFactoryToUse); + + ValidateTaskHostBehavior(buildOutput, expectedNodeReuse); + } + + private static bool? DetermineExpectedNodeReuse(string runtimeToUse, string taskFactoryToUse) + => (taskFactoryToUse, runtimeToUse) switch { - throw new ArgumentOutOfRangeException(nameof(taskFactoryToUse), "Unknown task factory to use: " + taskFactoryToUse); - } + // TaskHostFactory is always short-lived and out-of-proc (nodereuse:False) + (TaskHostFactory, _) => false, - using TestEnvironment env = TestEnvironment.Create(_output); + // AssemblyTaskFactory with CurrentRuntime runs in-proc + (AssemblyTaskFactory, CurrentRuntime) => null, + + // AssemblyTaskFactory with NET runtime: + // - On .NET Framework host: out-of-proc with long-lived sidecar (nodereuse:True) + // - On .NET host: in-proc + (AssemblyTaskFactory, NetRuntime) => +#if NET + null, // On .NET host: in-proc execution +#else + true, // On .NET Framework host: out-of-proc with long-lived sidecar +#endif + _ => throw new ArgumentException($"Unknown combination: runtime={runtimeToUse}, factory={taskFactoryToUse}") + }; + + private string ExecuteBuildWithTaskHost(string runtimeToUse, string taskFactoryToUse) + { string testProjectPath = Path.Combine(TestAssetsRootPath, "TaskHostLifecycleTestApp.csproj"); - string testTaskOutput = RunnerUtilities.ExecBootstrapedMSBuild( - $"{testProjectPath} -v:n -restore /p:RuntimeToUse={runtimeToUse} /p:TaskFactoryToUse={taskFactoryToUse}", - out bool successTestTask, + string output = RunnerUtilities.ExecBootstrapedMSBuild( + $"{testProjectPath} -v:n -restore /p:RuntimeToUse={runtimeToUse} /p:TaskFactoryToUse={taskFactoryToUse}", + out bool success, outputHelper: _output); - successTestTask.ShouldBeTrue(); + success.ShouldBeTrue("Build should succeed"); - // Verify execution mode (out-of-proc vs in-proc) and node reuse behavior + return output; + } + + private static void ValidateTaskHostBehavior(string buildOutput, bool? expectedNodeReuse) + { if (expectedNodeReuse.HasValue) { - // For out-of-proc scenarios, validate the task runs in a separate process - // by checking for the presence of command-line arguments that indicate task host execution - testTaskOutput.ShouldContain("/nodemode:", - customMessage: "Task should run out-of-proc and have /nodemode: in its command-line arguments"); + buildOutput.ShouldContain("/nodemode:", customMessage: "Task should run out-of-proc and have /nodemode: in its command-line arguments"); - // Validate the nodereuse flag in the task's command-line arguments string expectedFlag = expectedNodeReuse.Value ? "/nodereuse:True" : "/nodereuse:False"; - testTaskOutput.ShouldContain(expectedFlag, - customMessage: $"Task should have {expectedFlag} in its command-line arguments"); + buildOutput.ShouldContain(expectedFlag, customMessage: $"Task should have {expectedFlag} in its command-line arguments"); } else { - // For in-proc scenarios, validate the task does NOT run in a task host - // by ensuring task host specific command-line flags are not present - testTaskOutput.ShouldNotContain("/nodemode:", - customMessage: "Task should run in-proc and not have task host command-line arguments like /nodemode:"); + buildOutput.ShouldNotContain("/nodemode:", customMessage: "Task should run in-proc and not have task host command-line arguments like /nodemode:"); } } } diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 6818b3b1965..a58a4bc167c 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -155,12 +155,39 @@ 4.5.4 4.5.1 4.5.0 + 4.5.0 + 4.7.1 + + + 9.0.11 + $(FrozenRuntimeVersionFor9) + $(FrozenRuntimeVersionFor9) + $(FrozenRuntimeVersionFor9) + $(FrozenRuntimeVersionFor9) + $(FrozenRuntimeVersionFor9) + $(FrozenRuntimeVersionFor9) + $(FrozenRuntimeVersionFor9) + $(FrozenRuntimeVersionFor9) + $(FrozenRuntimeVersionFor9) + $(FrozenRuntimeVersionFor9) + $(FrozenRuntimeVersionFor9) + + + + + + + + + + + @@ -175,20 +202,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/MSBuild/MSBuild.csproj b/src/MSBuild/MSBuild.csproj index a9c57846e05..781af0730a3 100644 --- a/src/MSBuild/MSBuild.csproj +++ b/src/MSBuild/MSBuild.csproj @@ -197,6 +197,7 @@ + diff --git a/src/MSBuild/ValidateMSBuildPackageDependencyVersions.cs b/src/MSBuild/ValidateMSBuildPackageDependencyVersions.cs index f68a6317b66..af57996ef8d 100644 --- a/src/MSBuild/ValidateMSBuildPackageDependencyVersions.cs +++ b/src/MSBuild/ValidateMSBuildPackageDependencyVersions.cs @@ -20,11 +20,11 @@ public class ValidateMSBuildPackageDependencyVersions : Task // Microsoft.Build.Conversion.Core and Microsoft.Build.Engine are deprecated, but they're still used in VS for now. This project doesn't directly reference them, so they don't appear in its output directory. // Microsoft.NET.StringTools uses API not available in net35, but since we need it to work for TaskHosts as well, there are simpler versions implemented for that. Ensure it's the right version. // Microsoft.Activities.Build and XamlBuildTask are loaded within an AppDomain in the XamlBuildTask after having been loaded from the GAC elsewhere. See https://github.com/dotnet/msbuild/pull/856 - private string[] assembliesToIgnore = { "Microsoft.Build.Conversion.Core", "Microsoft.NET.StringTools.net35", "Microsoft.Build.Engine", "Microsoft.Activities.Build", "XamlBuildTask" }; + private string[] assembliesToIgnore = { "Microsoft.Build.Conversion.Core", "Microsoft.NET.StringTools.net35", "Microsoft.Build.Engine", "Microsoft.Activities.Build", "System.ValueTuple", "XamlBuildTask" }; public override bool Execute() { - bool foundSystemValueTuple = false; + // bool foundSystemValueTuple = false; var settings = new XmlReaderSettings { @@ -94,7 +94,7 @@ public override bool Execute() if (String.Equals(name, "System.ValueTuple", StringComparison.OrdinalIgnoreCase) && String.Equals(version, "4.0.0.0") && String.Equals(assemblyVersion, "4.0.3.0")) { - foundSystemValueTuple = true; + // foundSystemValueTuple = true; } else { @@ -113,11 +113,11 @@ public override bool Execute() } } } - - if (!foundSystemValueTuple) - { - Log.LogError("Binding redirect for 'System.ValueTuple' missing."); - } + + // if (!foundSystemValueTuple) + // { + // Log.LogError("Binding redirect for 'System.ValueTuple' missing."); + // } return !Log.HasLoggedErrors; } diff --git a/src/MSBuild/app.amd64.config b/src/MSBuild/app.amd64.config index 00194107526..6393b8d80d9 100644 --- a/src/MSBuild/app.amd64.config +++ b/src/MSBuild/app.amd64.config @@ -62,23 +62,23 @@ - - + + - - + + - - + + - - + + @@ -96,15 +96,15 @@ - - + + - - + + @@ -112,66 +112,65 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + diff --git a/src/MSBuild/app.config b/src/MSBuild/app.config index 6f2cba28e6c..52243986175 100644 --- a/src/MSBuild/app.config +++ b/src/MSBuild/app.config @@ -33,11 +33,11 @@ - + - + @@ -53,67 +53,71 @@ - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + diff --git a/src/Package/MSBuild.VSSetup/files.swr b/src/Package/MSBuild.VSSetup/files.swr index 6fcf88bc189..9b44bb3f248 100644 --- a/src/Package/MSBuild.VSSetup/files.swr +++ b/src/Package/MSBuild.VSSetup/files.swr @@ -51,7 +51,6 @@ folder InstallDir:\MSBuild\Current\Bin file source=$(X86BinPath)Microsoft.Bcl.AsyncInterfaces.dll vs.file.ngenApplications="[installDir]\MSBuild\Current\Bin\MSBuild.exe" vs.file.ngenArchitecture=all vs.file.ngenPriority=2 file source=$(X86BinPath)System.Text.Encodings.Web.dll vs.file.ngenApplications="[installDir]\MSBuild\Current\Bin\MSBuild.exe" vs.file.ngenArchitecture=all vs.file.ngenPriority=2 file source=$(X86BinPath)System.Threading.Tasks.Extensions.dll vs.file.ngenApplications="[installDir]\MSBuild\Current\Bin\MSBuild.exe" vs.file.ngenArchitecture=all vs.file.ngenPriority=2 - file source=$(X86BinPath)System.ValueTuple.dll file source=$(X86BinPath)System.Numerics.Vectors.dll vs.file.ngenApplications="[installDir]\MSBuild\Current\Bin\MSBuild.exe" vs.file.ngenArchitecture=all vs.file.ngenPriority=2 file source=$(X86BinPath)System.Resources.Extensions.dll vs.file.ngenApplications="[installDir]\MSBuild\Current\Bin\MSBuild.exe" vs.file.ngenArchitecture=all vs.file.ngenPriority=3 file source=$(X86BinPath)System.Runtime.CompilerServices.Unsafe.dll vs.file.ngenApplications="[installDir]\MSBuild\Current\Bin\MSBuild.exe" vs.file.ngenArchitecture=all vs.file.ngenPriority=2 @@ -203,7 +202,6 @@ folder InstallDir:\MSBuild\Current\Bin\amd64 file source=$(X86BinPath)Microsoft.IO.Redist.dll vs.file.ngenArchitecture=all file source=$(X86BinPath)System.Text.Encodings.Web.dll vs.file.ngenArchitecture=all file source=$(X86BinPath)System.Threading.Tasks.Extensions.dll vs.file.ngenArchitecture=all - file source=$(X86BinPath)System.ValueTuple.dll file source=$(X86BinPath)System.Numerics.Vectors.dll vs.file.ngenArchitecture=all file source=$(X86BinPath)System.Resources.Extensions.dll file source=$(X86BinPath)System.Runtime.CompilerServices.Unsafe.dll vs.file.ngenArchitecture=all diff --git a/src/Tasks/System.Resources.Extensions.pkgdef b/src/Tasks/System.Resources.Extensions.pkgdef index a90ae6d001b..eff98829712 100644 --- a/src/Tasks/System.Resources.Extensions.pkgdef +++ b/src/Tasks/System.Resources.Extensions.pkgdef @@ -3,5 +3,5 @@ "codeBase"="$BaseInstallDir$\MSBuild\Current\Bin\System.Resources.Extensions.dll" "publicKeyToken"="cc7b13ffcd2ddd51" "culture"="neutral" -"oldVersion"="0.0.0.0-9.0.0.11" -"newVersion"="9.0.0.11" +"oldVersion"="0.0.0.0-10.0.0.1" +"newVersion"="10.0.0.1"