与Microsoft.Build.Execution.BuildManager并行构建解决方案

时间:2018-06-16 18:17:04

标签: c# microsoft.build

我试图在不同的线程上并行构建多个解决方案,但它不起作用。

代码如下:

var buildParameters = new BuildParameters(new ProjectCollection())
{
    MaxNodeCount = 1,
    Loggers = loggers
};

var buildRequest = new BuildRequestData(
    solutionFilePath,
    new Dictionary<string, string> { {"Configuration", "Release"} },
    "14.0",
    new[] { "Build" },
    null);

var result = new BuildManager().Build(buildParameters, buildRequest);

当为每个解决方案顺序执行时,它可以完美地工作。当在多个线程中同时执行此操作时,它会因以下错误而失败:

'StartUp.cs', line: 10, column: 12, error: 'The type or namespace name 'OwinStartupAttribute' could not be found (are you missing a using directive or an assembly reference?)'
'StartUp.cs', line: 10, column: 12, error: 'The type or namespace name 'OwinStartup' could not be found (are you missing a using directive or an assembly reference?)'
'Controllers\CacheController.cs', line: 2, column: 18, error: 'The type or namespace name 'Http' does not exist in the namespace 'System.Web' (are you missing an assembly reference?)'
'Controllers\LogController.cs', line: 2, column: 18, error: 'The type or namespace name 'Http' does not exist in the namespace 'System.Web' (are you missing an assembly reference?)'
'Controllers\LogController.cs', line: 3, column: 24, error: 'The type or namespace name 'Communication' does not exist in the namespace 'MyNamespace' (are you missing an assembly reference?)'

最初这段代码使用的BuildManager.DefaultBuildManager似乎是最常见的用法,但是它是一个单例而且失败了,因为BuildManager的单个实例一次只能构建一个东西。创建BuildManager的新实例会解决该问题,但会因上述错误而失败。我已经尝试将hostName参数设置为每个线程的唯一值,或者不提供它,但这没有区别(我找不到任何关于它的含义的文档)。

这是否只有一些静态共享资源可以防止这种情况发生,或者我做错了什么?如果有任何文档可能对此有所帮助,我会在正确的方向上欣赏指针(我在此处所做的每一次搜索都会得到在解决方案中并行化项目构建的结果)。

0 个答案:

没有答案