Построение решений параллельно с Microsoft.Build.Execution.BuildManager

Я пытаюсь построить несколько решений параллельно в разных потоках, и это не работает.

Код выглядит так:

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 не может построить только 1 вещь за один раз. Создание нового экземпляра BuildManager преодолевает эту проблему, но терпит неудачу с вышеуказанными ошибками. Я попытался установить для параметра hostName уникальное значение для каждого потока или не предоставить его, но это не имеет значения (и я не могу найти документацию о том, что это значит).

У этого просто есть некоторые статические общие ресурсы, которые препятствуют тому, чтобы это было возможно, или я делаю что-то не так? Если есть какая-либо документация, которая могла бы помочь в этом, я был бы признателен за указатель в правильном направлении (каждый поиск, который я сделал по этому, просто приводит к результатам для распараллеливания сборок проекта в решении).

0 ответов

Другие вопросы по тегам