有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

2024-05-20

使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 .net 工具链/toolsversion or /tv switch:

"C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:12.0 amazing.sln

这适用于所有版本msbuild,以及版本csc.exe等是根据上述正确选择的:

> "C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:4.0 amazing.sln
...
CoreCompile:
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe ...
...

> "C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:12.0 amazing.sln
...
CoreCompile:
  C:\Program Files (x86)\MSBuild\12.0\bin\Csc.exe ...
...

If I don't指定/tv,然后根据我使用的 msbuild 版本和一些环境变量,我可能会得到以下任何一个:

  • 项目文件的顶级元素中指定的 ToolsVersion
  • ToolsVersion对应的版本msbuild.exe我在用着
  • 一个值来自msbuild.exe.config
  • 来自注册表的值

(参见不同版本的覆盖工具版本设置MSDN 页面 https://msdn.microsoft.com/en-us/library/bb383985.aspx).

因此,为了使构建在构建服务器和本地计算机上具有一致的结果,我使用/tv跑步时msbuild.exe(事实上​​,这是在psake脚本,这也确保它使用相应的版本msbuild.exe).

However我无法使用/tv使用 Visual Studio 构建时进行切换。相反,Visual Studio 2013 及更高版本将使用该版本的 Visual Studio 附带的 .net 工具链unless:

  • 环境变量MSBUILDLEGACYDEFAULTTOOLSVERSION is set and...
  • ...所有项目文件都将 ToolsVersion 属性设置为我想要使用的版本。

这太巴洛克了,我不敢相信有人真的在这么做。我的问题是:

  • Is任何人在做MSBUILDLEGACYDEFAULTTOOLSVERSION thing?
  • 如果没有,是否有另一种方法可以让 Visual Studio 使用特定的 ToolsVersion,而不是使用该 ToolsVersion 附带的 Visual Studio 版本?可以存储在版本控制中(因此在项目或其他一些设置文件中)的东西将是理想的。

最后:

  • 我应该关心吗?鉴于 C# 编译器的每个后续版本都应该能够处理以前版本的输入,并且我可以在项目文件中设置目标 .net 框架和 C# 语言级别,这是否足以确保可重复构建?

(我的偏见是我should照顾,因为:

  • 我希望 IDE 中的构建和构建服务器上的构建相同(当然)
  • 我希望能够使用 VS2015(以及未来的版本),因为它是比以前版本更好的 IDE,但我不想被迫使用新的工具链,直到我决定这样做。

也许是我想要的太多了……)

有关问题的具体示例,请参阅我的msbuild-vs-vs2015-tools版本 https://github.com/guyboltonking/msbuild-vs-vs2015-toolsversiongithub 上的存储库。


一些背景:我问这个问题是因为我们最近遇到了 CI 构建错误,当时我的一位同事提交了 C# 6.0 代码,该代码在他们的 Visual Studio 2015 副本上使用 Roslyn 编译得很好,但在 CI 中失败了,因为that使用以前版本的 .net 工具链(他们使用了没有 setter 的自动属性,这在 Roslyn 中很好,但在早期版本中则不然)。我们将更新 Roslyn 的 CI 版本,但我想看看我们是否可以防止将来发生此类事情。


我通过编写一个临时设置环境变量的 Visual Studio 扩展解决了这个问题MSBUILDDEFAULTTOOLSVERSION在构建期间;要使用的值是从文件中读取的.toolsversion在同一目录中.sln文件。 psake 脚本读取相同.toolsversion文件并将值传递给/tv switch.

扩展的代码可以在这里找到:https://github.com/guyboltonking/set-toolsversion-extension https://github.com/guyboltonking/set-toolsversion-extension。遗憾的是,我目前没有使用 C++,甚至没有使用 Visual Studio,因此我无法为它提供任何支持(但我可以告诉你,我使用它几个月了,没有任何问题)。

感谢 @efaruk 提醒我存在MSBUILDDEFAULTTOOLSVERSION.

编辑:感谢@mbadawi23,现在可以在 VS2015 和 VS2017 中使用该扩展。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion? 的相关文章

  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 在运行时设置 DataGridView 上的 DataFormatString?

    是否可以在运行时设置 ASP NET DataGridView 中的列或单元格的 DataFormatString 属性 这应该有效 BoundField priceField grid Columns 0 as BoundField pr
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • 如何在 VS Code 中为 CMake 项目设置 C/C++ IntelliSense?

    我正在尝试使用 libTooling 编写一个工具 我对其进行了设置 以便它可以使用 LLVM 文档中的示例进行编译 然而 C C IntelliSense 似乎不适用于 CMake 项目 我的工具位于
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐