c# - 当 MaxNodeCount 大于 1 时,MSBuild ver.16 运行数百个 MSBuild 进程
问题描述
我们有一个应用程序,它构建和准备我们的 ASP.NET 应用程序的“部署包”。它引用了运行良好的 .NET Framework MSBuild。几周前,我们开始使用 VS2019 而不是 VS2015。由于一些 NuGet 包,我们不得不用最新的 MSBuild 更新这个应用程序,它现在是 VS 的一部分,不再是 GAC 中的一部分。我是使用这个文档做到的。然后乐趣开始了......:/我发现问题在于BuildParameters.MaxNodeCount属性:
- 如果我将它的值设置为 1,一切正常,但比更新前慢得多。
- 如果 value 设置为大于 1 的值(我将其设置为Environment.ProcessorCount),则会启动数百个 MSBuild 进程。有时它可以工作,但大多数时候它会因内存不足异常而失败。有时甚至操作系统崩溃,需要重新启动。
在更新之前BuildProperties.MaxNodeCount设置为Environment.ProcessorCount并且一切正常。
知道什么会导致这种行为吗?为什么不考虑属性 MaxNodeCount?
编辑1:
调用 MSBuild API 的代码:
Dictionary<string, string> GlobalProperty = new Dictionary<string, string>();
GlobalProperty.Add("Platform", "Any CPU");
GlobalProperty.Add("Configuration", "Release");
GlobalProperty.Add("TargetFrameworkVersion", "v4.8");
GlobalProperty.Add("DeployOnBuild", "true");
GlobalProperty.Add("PublishProfile", "passed_as_input_parameter");
GlobalProperty.Add("AspnetMergePath", "passed_as_input_parameter");
BuildResult buildResult;
FileLogger fl = new FileLogger()
{
Parameters = @"logfile=log_file_path;append=true",
Verbosity = LoggerVerbosity.Normal
};
BuildParameters bp = new BuildParameters()
{
Loggers = new List<Microsoft.Build.Framework.ILogger> { fl }.AsEnumerable(),
DetailedSummary = false,
OnlyLogCriticalEvents = false,
ShutdownInProcNodeOnBuildFinish = true,
MaxNodeCount = Environment.ProcessorCount
};
BuildRequestData br;
br = new BuildRequestData(projectFileName, GlobalProperty, null, new string[] { "Clean", "Rebuild" }, null);
buildResult = BuildManager.DefaultBuildManager.Build(bp, br);
解决方案
推荐阅读
- css - 努力在 React 上导航样式
- c# - 如何使用 JwtBearer 身份验证为服务创建客户端集成测试
- python - Python os.makedirs 调用“FileNotFound”错误
- c++ - 由于指针/类型别名规则,这是未定义的 C++ 吗?
- excel - 如何在 Tosca 中增加 excel 行号
- bash - 如何将“git push”别名化为自身+运行脚本?
- vue.js - 如何动态获取二维码文本vue?
- visual-studio - Visual Basic System.Data.OleDb.OleDbException:“没有为一个或多个必需参数提供值。” 它以前有效,但现在无效。发生什么事?
- office-js - 对话框 API 问题 - 按下 Esc 键后显示的对话框仍然可见
- git - 在编译和构建 delphi 应用程序期间查询 Git 数据