You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:29:23