diff --git a/src/Cli/Microsoft.DotNet.Cli.Utils/MSBuildForwardingAppWithoutLogging.cs b/src/Cli/Microsoft.DotNet.Cli.Utils/MSBuildForwardingAppWithoutLogging.cs index c4c2758580ae..8cdb31a59721 100644 --- a/src/Cli/Microsoft.DotNet.Cli.Utils/MSBuildForwardingAppWithoutLogging.cs +++ b/src/Cli/Microsoft.DotNet.Cli.Utils/MSBuildForwardingAppWithoutLogging.cs @@ -16,6 +16,7 @@ namespace Microsoft.DotNet.Cli.Utils internal class MSBuildForwardingAppWithoutLogging { private static readonly bool AlwaysExecuteMSBuildOutOfProc = Env.GetEnvironmentVariableAsBool("DOTNET_CLI_RUN_MSBUILD_OUTOFPROC"); + private static readonly bool DoNotUseMSBUILDNOINPROCNODE = Env.GetEnvironmentVariableAsBool("DOTNET_CLI_DO_NOT_USE_MSBUILDNOINPROCNODE"); private const string MSBuildExeName = "MSBuild.dll"; @@ -53,6 +54,13 @@ public MSBuildForwardingAppWithoutLogging(IEnumerable argsToForward, str _argsToForward = argsToForward; MSBuildPath = msbuildPath ?? defaultMSBuildPath; + if (!DoNotUseMSBUILDNOINPROCNODE) + { + // Force MSBuild to use external working node long living process for building projects + // We also refers to this as MSBuild Server V1 as entry process forwards most of the work to it. + EnvironmentVariable("MSBUILDNOINPROCNODE", "1"); + } + // If DOTNET_CLI_RUN_MSBUILD_OUTOFPROC is set or we're asked to execute a non-default binary, call MSBuild out-of-proc. if (AlwaysExecuteMSBuildOutOfProc || !string.Equals(MSBuildPath, defaultMSBuildPath, StringComparison.OrdinalIgnoreCase)) { @@ -92,6 +100,8 @@ public void EnvironmentVariable(string name, string value) if (value == string.Empty || value == "\0") { + // Do not allow MSBuild NOIPROCNODE as null env vars are not properly transferred to build nodes + _msbuildRequiredEnvironmentVariables["MSBUILDNOINPROCNODE"] = "0"; // Unlike ProcessStartInfo.EnvironmentVariables, Environment.SetEnvironmentVariable can't set a variable // to an empty value, so we just fall back to calling MSBuild out-of-proc if we encounter this case. // https://github.com/dotnet/runtime/issues/50554