Ich möchte in einem Programm ermitteln, ob das Programm unter Windows 10 oder 11 (besser in welchem Windows XP, 7, 8.1. 10, 11) läuft.
Das Programm mache ich mit C# unter VS2022.
Es geht eigentlich ganz einfach mit
string description = RuntimeInformation.OSDescription;
Hier die Ergebnisse:
Windows 10 liefert ⇒ Microsoft Windows 10.0.19045 <= Build
Windows 11 liefert ⇒ Microsoft Windows 10.0.22621 <= Build
Muss man nun abfragen ; Build > 22000 = Win11, ansonsten Win10 ?
hk
Dazu gibst tausende von verschiedener Möglichkeiten.
Siehe Google Suche nach .NET detect windows Version
Und ja, die Buildnummern muss man immer beachten.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Du solltest nicht einen String abfragen, sondern direkt die Versionsnummer:
Version version = Environment.OSVersion.Version;
Noch besser
int buildNo = Environment.OSVersion.Version.Build
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Da wir nicht wissen, wie die Versionsnummern in der Zukunft weitergezählt werden, sollte man aber auch zwingend Major und Minor daraufhin prüfen, ob diese auch wirklich 10 bzw. 0 sind. Sonst ist die Verwirrung groß wenn (warum auch immer) Windows 12 die Version 10.1.12345.0 hat.
Die BuildId ist das einzig Konstante in der Windows Versionierung.
Major und Minor sind bei Windows schon immer (wie bei der meisten Software) Marketing-Versionen.
Windows hält sich hier inhaltlich nicht an SemVer. BuildId wird aber mit jedem CI-Build unique erzeugt.
Glaskugelraten: sehr wahrscheinlich wird Windows 12 nicht mit 30xxx anfangen, da an Windows viel mehr und schneller gearbeitet wird.
Wird also vermutlich ein anderer Range werden; wer weiß, vielleicht bei 100xxx oder sowas.
Version 10.0.x kann übrigens sowohl Windows 10 sein wie auch Windows Server 2016 bzw. 2019.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Wenn der Build bei 100.000 anfangen soll wird dann auch die Struktur in VERSIONINFO geändert?
Dort wird die Version ja als 64bit Wert angelegt (4x 16bit = 0..65535).
Meine Glaskugel ist in dem Bereich aber ganz wolkig, somit lassen wir uns überraschen.
Ändert an der Situation ja nichts.
Davon abgesehen wird dem Windows Team herzlich egal sein wie das .NET Team die Version als Objekt implementiert hat.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich sprach eigentlich von diesem VERSIONINFO
und nicht von System.Version
, denn dort passt es problemlos, weil dort für Build (und auch die anderen Teile) ein Int32
verwendet wird.