如何在命令行中确定C#编译器版本

10

有没有命令可以获取C#编译器版本? csc 命令似乎没有选项可以显示编译器版本。

P.S. 当我在 Visual Studio 2015开发人员命令提示符 中输入 csc 命令时,它会返回:

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

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


2
在您的计算机上可能会有多个版本的编译器。 https://dev59.com/F2Ik5IYBdhLWcg3wJ7T4 和 https://dev59.com/wGEh5IYBdhLWcg3wGwGO 提供了一些信息。 - ADyson
1
仅仅因为编译器版本是1.3,并不意味着它不能支持 .NET 4.5/6,只是意味着他们没有改变太多。 - BugFinder
当我从VS2015的开发人员命令提示符中运行csc时,它报告版本1.3.1.6016。当我从VS2012的开发人员命令提示符中运行csc时,它报告4.7.2053.0。 - PaulF
1
@m.rogalski:同意 - 查看路径环境变量,它们是不同的 - 但其中有太多内容,很难找到哪个版本被首先发现。在我的电脑上,有19个CSC.EXE实例 - 版本从1.0.0.xxx到8.0.xx.xxx不等。 - PaulF
1
在大多数情况下,C#编译器版本的使用是很少的。您使用的MSBuild版本更为重要。以下答案已经分享了大量信息,我还有两篇博客文章提供更多信息,C#编译器的历史MSBuild的历史 - Lex Li
显示剩余8条评论
2个回答

7
请记住您的机器上至少会有两个版本的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。我从来没有看过一个坚实的理由,除了“避免混淆”,我认为这是一种使它看起来新鲜的方法。

1
作为对“new-ish”这个问题的直接回答,CSC的新版本(更新:Roslyn 2及以上版本,请参见Cameron MacFarland的评论)确实有一个/version开关:
c:\>csc /version 
2.3.2.62116 (8522b473)

对于脚本目的(如果您想要切换版本),这可能已经足够了,以及测试的%errorlevel%,以放置在过时的存储桶中。
然而,/versionhttps://learn.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 (文件日期为2017年9月22日),但我还有C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ csc.exe ,版本为4.7.2046.0 (文件日期为2017年3月18日)(不使用/ version开关)。

所以回答

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

我会说,是的,也许有时候,但我会对那个版本持怀疑态度。从我拥有的版本戳来看,报告的版本是csc.exe程序集的文件版本,该程序集似乎来自编译csc的“更大实体”的版本,而Rosyln和“传统”编译器至少有不兼容的编号方案。


1
在VS2015中出现了无法识别的选项!我认为你是指新近的VS2017。 - ma.mehralian
2
/version 参数在 Roslyn 的第二个版本中得以实现。https://github.com/dotnet/roslyn/issues/7588 - Cameron MacFarland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接