Unter der Haube verwendet die GetVersionEx function, die veraltet ist. Die Dokumentation warnt vor dem von Ihnen beobachteten Verhalten:
Anwendungen, die nicht für Windows 8.1 oder Windows 10 verfügbar sind, geben den Windows 8-Betriebssystemversionswert (6.2) zurück.
Die Dokumentation geht weiter zu empfehlen:
das aktuelle Betriebssystem zu identifizieren, ist in der Regel nicht der beste Weg, um zu bestimmen, ob eine bestimmte Betriebssystem-Funktion vorhanden ist. Dies liegt daran, dass dem Betriebssystem möglicherweise neue Funktionen in einer weitervertreibbaren DLL hinzugefügt wurden. Anstatt GetVersionEx zu verwenden, um die Betriebssystemplattform oder die Versionsnummer zu ermitteln, müssen Sie das Vorhandensein des Features selbst testen.
Wenn die oben genannte Empfehlung nicht geeignet für Ihren Fall ist, und Sie wirklich wollen, die tatsächliche Lauf OS-Version überprüfen, dann die Dokumentation enthält auch einen Hinweis dazu:
das aktuelle System vergleichen Version auf eine erforderliche Version, verwenden Sie die VerifyVersionInfo Funktion anstelle von GetVersionEx, um den Vergleich selbst durchzuführen.
Der folgende Artikel hat eine Arbeitslösung geschrieben mit der VerifyVersionInfo Funktion: Version Helper API for .NET.
geben volle Anerkennung an den Autor dieses Artikels, das folgende Codefragment das Verhalten liefern sollten Sie suchen:
public class Program
{
static void Main(string[] args)
{
Console.WriteLine(IsWindowsVersionOrGreater(6, 3, 0)); // Plug in appropriate values.
}
[StructLayout(LayoutKind.Sequential)]
struct OsVersionInfoEx
{
public uint OSVersionInfoSize;
public uint MajorVersion;
public uint MinorVersion;
public uint BuildNumber;
public uint PlatformId;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string CSDVersion;
public ushort ServicePackMajor;
public ushort ServicePackMinor;
public ushort SuiteMask;
public byte ProductType;
public byte Reserved;
}
[DllImport("kernel32.dll")]
static extern ulong VerSetConditionMask(ulong dwlConditionMask,
uint dwTypeBitMask, byte dwConditionMask);
[DllImport("kernel32.dll")]
static extern bool VerifyVersionInfo(
[In] ref OsVersionInfoEx lpVersionInfo,
uint dwTypeMask, ulong dwlConditionMask);
static bool IsWindowsVersionOrGreater(
uint majorVersion, uint minorVersion, ushort servicePackMajor)
{
OsVersionInfoEx osvi = new OsVersionInfoEx();
osvi.OSVersionInfoSize = (uint)Marshal.SizeOf(osvi);
osvi.MajorVersion = majorVersion;
osvi.MinorVersion = minorVersion;
osvi.ServicePackMajor = servicePackMajor;
// These constants initialized with corresponding definitions in
// winnt.h (part of Windows SDK)
const uint VER_MINORVERSION = 0x0000001;
const uint VER_MAJORVERSION = 0x0000002;
const uint VER_SERVICEPACKMAJOR = 0x0000020;
const byte VER_GREATER_EQUAL = 3;
ulong versionOrGreaterMask = VerSetConditionMask(
VerSetConditionMask(
VerSetConditionMask(
0, VER_MAJORVERSION, VER_GREATER_EQUAL),
VER_MINORVERSION, VER_GREATER_EQUAL),
VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
uint versionOrGreaterTypeMask = VER_MAJORVERSION |
VER_MINORVERSION | VER_SERVICEPACKMAJOR;
return VerifyVersionInfo(ref osvi, versionOrGreaterTypeMask,
versionOrGreaterMask);
}
}
Haftungsausschluss: Ich habe keine 10 Fenster noch, so dass ich haven‘ t getestet, um den Code auf Windows 10.
Haben Sie [manifestieren die app] (https://msdn.microsoft.com/en-us/library/windows /desktop/dn481241%28v=vs.85%29.aspx) für Windows 10? – GSerg
Führen Sie Ihr Programm im Kompatibilitätsmodus aus? – Graffito
Es gibt andere Möglichkeit, diese Informationen zu erhalten, überprüfen Sie diesen Beitrag http://stackoverflow.com/questions/6331826/get-os-version-friendly-name-in-c-sharp – Rahul