Environment.OSVersion no me da la versión correcta del sistema operativo
El problema y solución que planteo en esta entrada es el siguiente:
Nos encontramos con una aplicación de consola (por ejemplo) que voy a desarrollar en .NET Framework sobre un sistema operativo Windows 10.
Utilizando Environment.OSVersion, podremos obtener la versión del sistema operativo.
Parece fácil y de hecho lo es.
La tabla de versiones de Windows es más o menos la siguiente:
OS: Windows 95
PlatformId: Win32Windows
Major version: 4
Minor version: 0
OS: Windows 98
PlatformId: Win32Windows
Major version: 4
Minor version: 10
OS: Windows Me
PlatformId: Win32Windows
Major version: 4
Minor version: 90
OS: Windows NT 4.0
PlatformId: Win32NT
Major version: 4
Minor version: 0
OS: Windows 2000
PlatformId: Win32NT
Major version: 5
Minor version: 0
OS: Windows XP
PlatformId: Win32NT
Major version: 5
Minor version: 1
OS: Windows 2003
PlatformId: Win32NT
Major version: 5
Minor version: 2
OS: Windows Vista
PlatformId: Win32NT
Major version: 6
Minor version: 0
OS: Windows 2008
PlatformId: Win32NT
Major version: 6
Minor version: 0
OS: Windows 7
PlatformId: Win32NT
Major version: 6
Minor version: 1
OS: Windows 2008 R2
PlatformId: Win32NT
Major version: 6
Minor version: 1
OS: Windows 8
PlatformId: Win32NT
Major version: 6
Minor version: 2
OS: Windows 8.1
PlatformId: Win32NT
Major version: 6
Minor version: 3
OS: Windows 10
PlatformId: Win32NT
Major version: 10
Minor version: 0
El problema surge cuando ejecutamos nuestra aplicación.
Al ejecutar nuestra aplicación, es posible que ésta nos digá que se trata de Windows 8, pero en realidad, sabemos que es Windows 10.
Si ocurre así, es porque las aplicaciones no tienen asignado internamente el manifiesto para Windows 8.1 y Windows 10 Insider Preview, por lo que devuelven como valor, de Windows 8 OS el valor (6.2).
Para evitar esto, bastará con añadir un manifiesto en nuestra aplicación y descomentar unas líneas de código de dicho manifiesto.
Desde Visual Studio, agrega en tu proyecto un Application Manifest File:
Se agregará al proyecto un fichero app.manifest.
Y salvo que quieras modificar otros datos del manifiesto, déjalo aproximadamente como este:
<?xml version="1.0" encoding="utf-8"?> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows Vista --> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" /> <!-- Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" /> <!-- Windows 8 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" /> <!-- Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" /> <!-- Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> </application> </compatibility> </assembly>
Fíjate que he descomentado las líneas correspondientes al desbloqueo de versiones del sistema operativo.
Ahora, si ejecutamos nuestra aplicación, obtendremos un valor válido para Environment.OSVersion.
¡Happy Coding!