我有一个使用 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
的编程方式是什么?
最佳答案
var buildRequest = new BuildRequestData(_solutionPath, globalProperties, null, new[] {"Build"},
创建 BuildRequestData 时,为 toolsVersion 传递 null。
然后确保项目引用的 Microsoft.Build*.dll 版本正确。 默认情况下,VS 将从它自己的安装目录中添加那些。更新的应该存在于“C:\Program Files (x86)\MSBuild\14.0\Bin”
关于c# - Microsoft.Build.Framework 指定工具版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35716836/