environment.osversion.version 返回10.0不是bug,而是微软自windows 10起弃用该字段作产品版本判断的设计——它仅表示nt内核版本(10.0),win10与win11共享同一内核,故major/minor恒为10/0;可靠区分方式是读取注册表currentmajorversionnumber:3为win10,4为win11。

Environment.OSVersion.Version 返回的 10.0 不是 bug,是微软从 Windows 10 起就明确弃用该字段做精确版本判断的设计结果——它只反映内核版本(NT 10.0),不是用户看到的“Windows 10/11”产品版本。
Environment.OSVersion.Version 主次版本号永远是 10.0
调用 Environment.OSVersion.Version.Major 和 Environment.OSVersion.Version.Minor 在 Win10 和 Win11 上都返回 10 和 0。这是因为两者共享同一内核(NT 10.0),.NET 直接透传了系统内核报告的值。
常见错误现象:
- 写
if (os.Version.Major == 10 && os.Version.Minor == 0)就认为是 Win10 —— 实际上 Win11 也满足 - 用
os.Version.ToString()解析字符串如"Microsoft Windows 10.0.22621"判断系统 —— Win11 的VersionString在某些 .NET 运行时下仍显示为"10.0",且格式不一致
这个字段唯一可靠的用途是:确认是否为“Windows NT 系列且版本 ≥ 10.0”,即排除 Win7/XP 等老系统。不要把它当产品版本用。
Build 号不能单独用于 Win10/Win11 区分
Environment.OSVersion.Version.Build 数值在 Win10 和 Win11 中存在重叠,例如 22621 和 22631 既可能出现在 Win10 22H2,也可能出现在 Win11 23H2。
使用场景限制:
本文档主要讲述的是Android 操作系统的介绍;Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 仅靠 Build ≥ 22000 判定 Win11 是早期经验,但已不可靠:Win10 21H2 后续更新中也出现了 ≥ 22000 的构建号
- Build 值受 Windows Update 累积补丁影响,同一功能版本(如 22H2)在不同设备上 Build 可能差几百
- 该值在非 Windows 平台(Linux/macOS)上无意义,
Environment.OSVersion仍会返回默认值,容易误判
注册表 CurrentMajorVersionNumber 是最稳的 Win10/Win11 区分方式
微软官方推荐路径是读取注册表键 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 下的 CurrentMajorVersionNumber DWORD 值。
实操建议:
- 值为
3→ Windows 10 全系(含所有更新) - 值为
4→ Windows 11(自 21H2 起引入,所有正式版 Win11 均为 4) - 需引用
Microsoft.Win32.Registry,用Registry.GetValue()(自动处理句柄释放,避免泄漏) - 代码示例:
int? version = Registry.GetValue( @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentMajorVersionNumber", null) as int?;
这个值不随语言、UI 层或 .NET 版本变化,无需管理员权限,且在 .NET Core/.NET 5+ 中完全可用。
ReleaseId 字符串更直观但要注意版本命名规则
同注册表路径下的 ReleaseId 是字符串类型,如 "22H2"、"23H2",对人更友好,但需注意命名逻辑:
-
"21H1"–"22H2"→ Windows 10 -
"23H2"及之后("24H2"、"25H1")→ Windows 11(23H2 是首个正式 Win11 版本号) - 不能只看年份数字:Win10 也有
"21H2",Win11 也有"21H2"(预览版),但后者未发布为正式版,实际生产环境不会遇到 - 字符串比较要忽略大小写,且需校验格式(防止空值或异常字符)
比起 CurrentMajorVersionNumber,ReleaseId 更适合日志记录或 UI 显示,但底层逻辑判断仍建议优先用 DWORD 值——它更轻量、更确定、更少解析开销。
真正容易被忽略的点是:很多人查完注册表后没做空值或类型转换防护,Registry.GetValue() 返回 null 或 object 时直接强转会抛异常;还有人习惯用 OpenSubKey() + GetValue() 手动管理句柄,忘了 using,导致资源泄漏。这些细节比“选哪个键”更能决定代码在线上是否稳定。










