背景
Windows 11 操作系统已经正式发布快有一年了,在 .Net 开发中,我们获取操作系统版本,经常使用 Environment.OSVersion.Version.Major 和 Minor
(6.1 = Windows 7, 10.0 = Windows 10),但是当 Win11 出现以后,一切变的有些不一样了。因为 Win11 获取到的操作系统版本[1] Major Minor 与 Win10 一样。
在某些情况下因为不同的系统存在一些表现上的差别,我们需要区分操作系统的版本在编码时进行不同的处理,所以正确的获取操作系统版本非常重要,特别是 Win10 和 Win11 的变化还挺大的。
方案
其实剑走偏锋,我们可以通过检测某些软件(win11做了某些系统软件的删减和增加)以及某些系统软件的版本号来实现,但毕竟是偏门左道。
不过,经过多方查找和测试,我在 Stackoverflow[2] 找到一个相对来说靠谱的做法,Windows 10 从内部版本 10240 开始,以内部版本 19044 结束。Windows 11 从内部版本 22000 开始,那么:
Environment.OSVersion.Version.Build >= 22000;
通上面的代码,在我们确定 Windows 操作系统之后就可以通过上面的代码轻松判断操作系统是否是 Win11 了。
后记
最后讲一下寻找解决方案过程中忍不住吐槽的地方,你敢信我在测试一个通过注册表读取操作系统版本的方案最后 Win11 获得结果产品名竟然是 Windows 10 Pro
?
而且这个操作系统是我前几天才使用 Win11 的官方镜像新装的,还是从 Win11 的开发者预览版新装的稳定版。
string HKLMWinNTCurrent = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion";
string osName = Registry.GetValue(HKLMWinNTCurrent, "productName", "").ToString();
References
[1]
操作系统版本: https://learn.microsoft.com/zh-cn/windows/win32/sysinfo/operating-system-version[2]
Stackoverflow: https://stackoverflow.com/questions/69038560/detect-windows-11-with-net-framework-or-windows-api