【问题标题】:How to determine C# compiler version in command line如何在命令行中确定 C# 编译器版本
【发布时间】:2018-05-17 21:43:37
【问题描述】:

是否有任何命令可以获取 C# 编译器版本? csc 命令接缝没有显示编译器版本的选项。

附言 当我在 VS2015 的开发人员命令提示符 中输入 csc 命令时,它会返回:

Microsoft (R) Visual C# Compiler version 1.3.1.60616
Copyright (C) Microsoft Corporation. All rights reserved.

但是我很确定我的 C# 编译器比 1.3 更新!

【问题讨论】:

  • 您的机器上可以有多个版本的编译器。 stackoverflow.com/questions/19532942/…stackoverflow.com/questions/22814922/… 提供一些启示
  • 只是因为编译器是 1.3 并不意味着它不能做 .l.net 4.5/6 这只是意味着他们不必改变太多..
  • 当每个开发命令提示符都有自己的一组变量(包括带有 csc 的变量)并且您可以在硬盘驱动器上放置多个 csc 时,难道不是这种情况吗?跨度>
  • @m.rogalski:同意-查看路径环境变量它们是不同的-尽管要找到首先找到的版本太多了。在我的 PC 上有 19 个 CSC.EXE 实例 - 从版本 1.0.0.xxx 到版本 8.0.xx.xxx
  • 在大多数情况下,C# 编译器版本用处不大。您使用的 MSBuild 版本更重要。下面的答案已经很好地分享了大量信息,我还有两篇博文更多,history of C# compilerhistory of MSBuild

标签: c#


【解决方案1】:

作为对 new-ish [update: roslyn versions above 2, see comment by Cameron MacFarland] 问题的字面回答,csc 的版本确实有 /version 开关:

c:\>csc /version 
2.3.2.62116 (8522b473)

出于编写脚本的目的(如果你想打开版本的话),这可能就足够了,同时测试 csc /version%errorlevel% 以放置在一个太旧的存储桶中。

/version 但是没有出现在https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/listed-alphabetically(这似乎是最新版本),我找不到任何列出它添加的版本的任何内容。

更新:我也会非常小心 csc 报告的版本号,例如我个人的“默认”在 C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Roslyn 并且版本为 2.3.2.62116(文件日期为 22/ 9/2017),但我也有 C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe,版本为 4.7.2046.0(文件日期为 18/03/2017)(并且不使用 /version 开关)。

所以回答

有没有获取C#编译器版本的命令?

我会说,是的,也许,有时,但我会用一小撮盐对待那个版本,看看我报告的版本是 csc.exe 程序集的文件版本,它似乎来自编译 csc 的“较大实体”的版本,并且 Rosyln 和“传统”编译器至少存在不兼容的编号方案。

【讨论】:

【解决方案2】:

请记住,您的计算机上至少有 2 个版本的 csc.exe。一个是作为 .NET Framework 安装的一部分提供的,就像往常一样,并遵循框架的版本编号。存储在 c:\windows\microsoft.net\framework\v4.0.30319 中,它保留在那里以与 System.CodeDom 和 sgen.exe 兼容。冻结在 C# 语言版本 5。现在大多数程序员在他们的机器上安装 .NET v4.7 时都会使用 4.7.x.0 版本。

另一个是作为 Roslyn 项目的一部分分拆出来的,存储在 MSBuild 目录中。重置版本号,重新从 1 开始编号。您将在使用开发人员命令提示符时运行该版本号。版本号重置的最可能原因是他们不想被锁定在框架发布节奏中,Roslyn 遭受了大量需要中间版本才能修复的错误。解耦引起的一个显着问题是在 C# v7 中添加了新的 ValueTuple 类型,这是大大改进的元组支持所必需的。编译器在框架可用之前发布,程序员不得不暂时使用 Nuget 包。

版本号重置并不经常发生。但另一个大家都知道的好例子是 .NETCore,它从 5.0 重置回 1.0。除了“避免混淆”之外,我从未看到过任何可靠的理由,我认为这是让它看起来新鲜的举措。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多