如何通过编程检测C#(非CLR)版本?.NET开发者求指导
检测C#版本的几种实用方法
嘿,刚好碰到过类似的需求!C#版本和CLR版本确实不是一一对应的——同一个CLR版本(比如.NET 6的CLR)可以支持多个C#版本(从C# 8到C# 12都能在.NET 6上编译运行)。下面分两种场景给你解决方案:
一、检测当前代码编译时使用的C#版本(编译时判断)
如果你想在代码里直接判断当前项目用的是哪个C#版本,可以利用编译器的预定义符号__CSCOMPVER,这个符号会被Roslyn编译器自动设置为当前C#版本的主版本号(比如C# 12就是12,C# 11就是11)。
直接上代码示例:
public static class CSharpVersionChecker { public static string GetCurrentCompilationCSharpVersion() { #if __CSCOMPVER >= 12 return "C# 12.0"; #elif __CSCOMPVER >= 11 return "C# 11.0"; #elif __CSCOMPVER >= 10 return "C# 10.0"; #elif __CSCOMPVER >= 9 return "C# 9.0"; #elif __CSCOMPVER >= 8 return "C# 8.0"; #elif __CSCOMPVER >= 7 return "C# 7.0"; #elif __CSCOMPVER >= 6 return "C# 6.0"; #else // C# 5及更早版本没有__CSCOMPVER符号 return "C# 5.0或更早版本"; #endif } }
这种方法的好处是编译时就确定了版本,完全不需要反射,性能也高。
二、检测已编译程序集的C#版本(运行时判断)
如果你拿到一个已编译的dll/exe,想知道它是用哪个C#版本编译的,可以通过反射读取程序集上的RuntimeVersionAttribute——这个特性是Roslyn编译器从C# 6开始自动添加到程序集里的,直接记录了编译时的C#版本。
代码示例:
using System; using System.Reflection; public static class CompiledAssemblyCSharpDetector { public static string GetAssemblyCSharpVersion(Assembly targetAssembly) { // 查找RuntimeVersionAttribute var versionAttr = targetAssembly.GetCustomAttribute<Microsoft.CodeAnalysis.CSharp.RuntimeVersionAttribute>(); if (versionAttr != null) { // 属性的Version值就是C#版本,比如"11.0"、"12.0" return $"C# {versionAttr.Version}"; } // 对于C# 5及更早版本,没有这个特性,只能通过CLR版本推测范围 var clrVersion = targetAssembly.ImageRuntimeVersion; return clrVersion switch { "v4.0.30319" => "C# 1.0-5.0(无法精确判断,需结合其他特征)", "v2.0.50727" => "C# 1.0-3.0(推测)", _ => $"未知C#版本,对应CLR版本:{clrVersion}" }; } }
注意事项:
- 这个方法依赖Roslyn编译器,如果你碰到的是用旧版
csc.exe(比如.NET Framework 4.0及以前的编译器)编译的程序集,可能没有RuntimeVersionAttribute,这时候只能通过CLR版本给出大致范围,无法精确到具体C#版本。 - 在.NET Core/.NET 5+中,
Microsoft.CodeAnalysis.CSharp是内置的,不需要额外引用;如果是.NET Framework项目,需要手动引用对应的NuGet包。
额外补充:通过编译器版本反推C#版本
如果你能获取到编译程序集的编译器版本,也可以对应到C#版本,比如:
- C# 12对应Roslyn 4.8+
- C# 11对应Roslyn 4.4+
- C# 10对应Roslyn 4.0+
不过这种方法不如直接读取特性准确,因为同一个编译器版本可能支持多个C#版本(比如Roslyn 4.8既支持C# 11也支持C# 12,取决于编译时的设置)。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

