Come posso determinare su quale sistema operativo è in esecuzione la mia app .NET Core? In passato potevo usare Environment.OSVersion
.
Qual è il modo attuale per determinare se la mia app è in esecuzione su Mac o Windows?
Come posso determinare su quale sistema operativo è in esecuzione la mia app .NET Core? In passato potevo usare Environment.OSVersion
.
Qual è il modo attuale per determinare se la mia app è in esecuzione su Mac o Windows?
Risposte:
System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()
OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux
bool isWindows = System.Runtime.InteropServices.RuntimeInformation
.IsOSPlatform(OSPlatform.Windows);
Grazie al commento di Oleksii Vynnychenko
È possibile ottenere il nome e la versione del sistema operativo come stringa utilizzando
var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription;
Ad esempio, osNameAndVersion
sarebbeMicrosoft Windows 10.0.10586
System.Runtime.InteropServices.RuntimeInformation.OSDescription
- restituisce la descrizione del sistema operativo con la versione, ecc.
System.Environment.OSVersion.Platform
per coerenza?
IsOSPlatform(OSPlatform.Create("FreeBSD"))
se sono supportati ora o possono essere aggiunti in futuro. Tuttavia, non è molto chiaro quale sarebbe un approccio sicuro per quali stringhe passare (ad esempio, il caso è importante o "bsd"
corrisponde a entrambi "FreeBSD"
e "NetBSD"
?). Vedi la discussione su questa funzione qui .
System.Environment.OSVersion.Platform
può essere utilizzato in .NET Framework completo e Mono ma:
System.Runtime.InteropServices.RuntimeInformation
può essere utilizzato in .NET Core ma:
È possibile bloccare funzioni non gestite specifiche della piattaforma come uname()
ma:
Quindi la mia soluzione suggerita (vedi il codice qui sotto) potrebbe sembrare saggia all'inizio ma:
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();
}