¿Cómo puedo determinar en qué sistema operativo se ejecuta mi aplicación .NET Core? En el pasado me vendría bien Environment.OSVersion
.
¿Cuál es la forma actual de determinar si mi aplicación se ejecuta en Mac o Windows?
¿Cómo puedo determinar en qué sistema operativo se ejecuta mi aplicación .NET Core? En el pasado me vendría bien Environment.OSVersion
.
¿Cuál es la forma actual de determinar si mi aplicación se ejecuta en Mac o Windows?
Respuestas:
System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()
OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux
bool isWindows = System.Runtime.InteropServices.RuntimeInformation
.IsOSPlatform(OSPlatform.Windows);
Gracias al comentario de Oleksii Vynnychenko
Puede obtener el nombre y la versión del sistema operativo como una cadena usando
var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription;
Por ejemplo osNameAndVersion
, seríaMicrosoft Windows 10.0.10586
System.Runtime.InteropServices.RuntimeInformation.OSDescription
- devuelve la descripción del sistema operativo con la versión, etc.
System.Environment.OSVersion.Platform
por coherencia?
IsOSPlatform(OSPlatform.Create("FreeBSD"))
si son compatibles ahora o si se pueden agregar en el futuro. Sin embargo, no está muy claro cuál sería un enfoque seguro para qué cadenas pasar (por ejemplo, ¿importa el caso o "bsd"
coincide con ambos "FreeBSD"
y "NetBSD"
?). Vea la discusión sobre esta característica aquí .
System.Environment.OSVersion.Platform
se puede utilizar en .NET Framework y Mono completos, pero:
System.Runtime.InteropServices.RuntimeInformation
se puede usar en .NET Core pero:
Puede invocar funciones no administradas específicas de la plataforma, como uname()
pero:
Entonces, mi solución sugerida (ver código a continuación) puede parecer astuta al principio, pero:
string windir = Environment.GetEnvironmentVariable("windir");
if (!string.IsNullOrEmpty(windir) && windir.Contains(@"\") && Directory.Exists(windir))
{
_isWindows = true;
}
else if (File.Exists(@"/proc/sys/kernel/ostype"))
{
string osType = File.ReadAllText(@"/proc/sys/kernel/ostype");
if (osType.StartsWith("Linux", StringComparison.OrdinalIgnoreCase))
{
// Note: Android gets here too
_isLinux = true;
}
else
{
throw new UnsupportedPlatformException(osType);
}
}
else if (File.Exists(@"/System/Library/CoreServices/SystemVersion.plist"))
{
// Note: iOS gets here too
_isMacOsX = true;
}
else
{
throw new UnsupportedPlatformException();
}