如何在.NET 5.0控制台应用程序中使用C#检查Windows版本

3

我正在开发一款“控制台游戏引擎”,但它只能在Windows 10上运行,因为在其他版本中无法正确显示“自定义颜色”,比如Win8,相反它们只是一堆Unicode代码。

example.png

所以我想检查Windows的版本是否为10,并且我做了这个:

var workingSysVer = Environment.OSVersion.Version.ToString().Substring(0, 2);
            if (workingSysVer != "10")
            {
                Console.Title = "OS Version Warning";
                // other code
            }

有没有更好的方法检查 Windows 版本?


该应用程序仅适用于Windows操作系统,也就是说它会生成.exe文件。 - KSZLAGK
1
这回答您的问题吗?如何获取Windows版本 - 如“Windows 10,版本1607”?和在.NET中检测Windows版本。 - user12031933
1
我的意思是,我做了这样的事情:如果(Microsoft.Win32.Registry.GetValue(@“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion”,“productName”,“”)。ToString()。Substring(0,10)!=“Windows 10”) { //其他东西 } - KSZLAGK
1
哦,哦耶,那就可以了。 - KSZLAGK
1
.StartWith("Windows 10")... 这就是为什么微软将不得不跳过 Windows 100 ;) - omajid
显示剩余3条评论
1个回答

4
你可以从这里使用所需内容(除了OSVersion,你还可以使用osNameosRelease):
using System;
using System.Linq;
using System.Reflection;
using System.Runtime.Versioning;
using Microsoft.Win32;

string NL = Environment.NewLine;
string HKLMWinNTCurrent = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion";

string osName = get(() => Registry.GetValue(HKLMWinNTCurrent, "productName", "").ToString());

string osRelease = get(() => Registry.GetValue(HKLMWinNTCurrent, "ReleaseId", "").ToString());
if ( !osRelease.IsNullOrEmpty() ) osRelease = $" ({ osRelease})";

string osVersion = Environment.OSVersion.Version.ToString();

string osType = Environment.Is64BitOperatingSystem ? "64-bits" : "32-bits";

string clr = Environment.Version.ToString();

string dotnet = get(() =>
{
  var attributes = Assembly.GetExecutingAssembly().CustomAttributes;
  var result = attributes.FirstOrDefault(a => a.AttributeType == typeof(TargetFrameworkAttribute));
  return result == null
          ? ".NET Framework (unknown)"
          : result.NamedArguments[0].TypedValue.Value.ToString();
});

string Platform = $"{osName} {osType} {osVersion}{osRelease}{NL}{dotnet}{NL}CLR {clr}";

string get(Func<string> func)
{
  try { return func(); }
  catch { return "(undefined)"; }
}

例子

Windows 10 Pro 64-bits 6.2.9200.0 (2009)
.NET Framework 4.7.2
CLR 4.0.30319.42000

我从未注意到6.2.9200是不正确的... ?

@nap的解决方案:如何获取Windows版本 - 就像"Windows 10,版本1607"?

@DanielDiPaolo的解释:.net中检测Windows版本


谢谢!那样检查肯定更好。 - KSZLAGK
这个在旧的Windows 10版本或Server 2016/2019上也能工作吗?我可以依赖它吗? - Shino Lex
在Windows 11中,osName仍然等于“Windows 10 Pro”,请参见此处:https://imgur.com/a/SupZVV8 - ilCosmico

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