我有一个使用c#6.0的目标项目我需要以编程方式构建它。
我有以下代码:
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 :(得分:1)
var buildRequest = new BuildRequestData(_solutionPath, globalProperties, null, new[] {"Build"},
创建BuildRequestData时,为toolsVersion传递null。
然后确保项目引用的Microsoft.Build * .dll是正确的版本。 默认情况下,VS会从其自己的安装目录中添加一些。更新的应存在于&#34; C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin&#34;