2016-03-01 2 views
3

У меня есть целевой проект, который использует C# 6.0 Мне нужно его программно построить.Microsoft.Build.Framework указать инструменты version

У меня есть код ниже:

 var pc = new ProjectCollection(); 
     pc.DefaultToolsVersion = "14.0" //set tools version 
     var globalProperty = new Dictionary<string, string> 
     { 
      {"Configuration", "Release"}, 
      {"Platform", "Any CPU"}, 
      {"OutputPath", Utils.GetGaugeBinDir()} 
     }; 

     var buildRequestData = new BuildRequestData(solutionFullPath, globalProperty, "14.0", new[] {"Build"}, null); //Set tools version here as well 

     var errorCodeAggregator = new ErrorCodeAggregator(); 
     var buildParameters = new BuildParameters(pc) {Loggers = new ILogger[] {consoleLogger, errorCodeAggregator}}; 

     var buildResult = BuildManager.DefaultBuildManager.Build(buildParameters, buildRequestData); 

Независимо от того, где я установил версию инструментов (из двух вариантов выше), не построить C# 6.0.

В командной строке, я могу это сделать:

msbuild foo.csproj /tv:14.0 /t:rebuild 

Я призываю это из MSBuild 12.0 каталога BIN, и она работает. Если я опустил флаг /tv:14.0, он не сработает, как ожидалось.

Итак, вопрос в том, что является программным способом указать /tv флаг на BuildManager?

+0

Я борюсь с той же проблемой. Вы выяснили решение? В настоящее время файл журнала из моей сборки предполагает, что он не может построить синтаксис C# 6.0. Я устанавливаю как DefaultToolsVersion экземпляра ProjectCollection, так и параметр BuildRequestData как 14.0. Ясно, что это неправильно (или недостаточно). –

+0

@ AlexanderHøst - Боюсь, нет. У меня есть два пути для исправления этого: (1) обновить мой код для использования MSBuild 14.0 или (2) вызвать процесс msbuild и передать соответствующие параметры. Мне тоже не нравится, поэтому оставляю его так, как сейчас :( –

ответ

0
var buildRequest = new BuildRequestData(_solutionPath, globalProperties, null, new[] {"Build"}, 

При создании данных BuildRequestData передайте значение null для toolsVersion.

Тогда убедитесь, что файл Microsoft.Build * .dll, на который ссылается ваш проект, является правильной версией. По умолчанию VS добавит их из собственной папки установки. Обновленные должны существовать в папке «C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin»

+1

Контекст в том, что я хочу иметь возможность вызывать сборку с одной из многих версий msbuild, т. Е. Если я знаю, что мое целевое решение является автором используя C# 6.0, я бы использовал msbuild 14.0, иначе я хотел бы использовать msbuild 12.0. Придется включить msbuild 14.0 в качестве зависимости, потребовав, чтобы я обновился до .net 4.6.2 Я предполагаю? Я бы предпочел не налагать это на все мои пользователей. –

Смежные вопросы