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"