如何与Microsoft.Build.Execution.BuildManager并行构建?



我正在尝试使用 MsBuild api 来运行构建 frpm C#。以下内容似乎有效,但仅运行构建单线程。我真的需要它来运行多线程。当我通过运行 msbuild 从命令行运行时,我可以使用/m 开关启动并行生成。如何以编程方式实现相同的目标?

var logger = new BasicLogger();
var buildParameters = new BuildParameters()
{
Loggers = new List<Microsoft.Build.Framework.ILogger>() { logger },
DetailedSummary = false,
EnableNodeReuse = false,
OnlyLogCriticalEvents = false,
ShutdownInProcNodeOnBuildFinish = true
};
var globalProperties = new Dictionary<string, string>
{
{ "Platform", platform },
{ "Configuration", configuration },
{ "BuildInParallel", "True" } // guessed at this, doesn't seem to have an effect
};
var targets = new string[] { target };
var buildRequestData = new BuildRequestData(projectFileName, globalProperties, "15.0", targets, null);
BuildManager.DefaultBuildManager.ResetCaches();
var buildResult = BuildManager.DefaultBuildManager.Build(buildParameters, buildRequestData);

指定在可能的情况下应并行尝试构建的 API 机制是BuildParameters.MaxNodeCount

要模仿msbuild.exe -m的默认行为,您可能需要指定"与计算机具有逻辑处理器一样多的进程:


var buildParameters = new BuildParameters()
{
Loggers = new List<Microsoft.Build.Framework.ILogger>() { logger },
DetailedSummary = false,
EnableNodeReuse = false,
MaxNodeCount = System.Environment.ProcessorCount,
OnlyLogCriticalEvents = false,
ShutdownInProcNodeOnBuildFinish = true
};

最新更新