c# - Microsoft.Build.Framework 指定工具版本

标签 c# msbuild

我有一个使用 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/

相关文章:

C# - 从 XML 文档中的特定标记获取值

c# - 如何诊断警告 MSB3277 : Found conflicts between different versions of the same dependent assembly that could not be resolved

.net-core - 使用 git log 使 MSBuild Exec 命令跨平台工作

iis - Jenkins msbuild 部署到远程 IIS

c# - 如何在 mvc DB First 模式中使用模型?

c# - 没有命名空间的 XML 反序列化

c# - 在C#中分配内存

c# - 静态 DBContext 返回错误值

powershell - MSBuild - 构建后自动部署 Windows 服务

msbuild - 在 MSBuild 的属性组中是否存在 "if"类型语句?