¿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.Platformpor 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();
}