Jak mogę określić, w którym systemie operacyjnym działa moja aplikacja .NET Core? W przeszłości mogłem użyć Environment.OSVersion
.
Jaki jest obecny sposób określenia, czy moja aplikacja działa na komputerze Mac czy Windows?
Jak mogę określić, w którym systemie operacyjnym działa moja aplikacja .NET Core? W przeszłości mogłem użyć Environment.OSVersion
.
Jaki jest obecny sposób określenia, czy moja aplikacja działa na komputerze Mac czy Windows?
Odpowiedzi:
System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()
OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux
bool isWindows = System.Runtime.InteropServices.RuntimeInformation
.IsOSPlatform(OSPlatform.Windows);
Dzięki komentarzowi Oleksii Vynnychenko
Nazwę i wersję systemu operacyjnego można uzyskać jako ciąg znaków za pomocą
var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription;
Np. osNameAndVersion
ByłobyMicrosoft Windows 10.0.10586
System.Runtime.InteropServices.RuntimeInformation.OSDescription
- zwraca opis systemu operacyjnego z wersją itp.
System.Environment.OSVersion.Platform
dla spójności?
IsOSPlatform(OSPlatform.Create("FreeBSD"))
czy są one obsługiwane teraz, czy mogą zostać dodane w przyszłości. Jednak nie jest bardzo jasne, jakie byłoby bezpieczne podejście do przekazywania ciągów (na przykład czy wielkość liter ma znaczenie, czy "bsd"
pasuje do obu "FreeBSD"
i "NetBSD"
?). Zobacz dyskusję na temat tej funkcji tutaj .
System.Environment.OSVersion.Platform
może być używany w pełnej wersji .NET Framework i Mono, ale:
System.Runtime.InteropServices.RuntimeInformation
może być używany w .NET Core, ale:
Możesz pinvoke niezarządzane funkcje specyficzne dla platformy, takie jak uname()
ale:
Tak więc moje sugerowane rozwiązanie (patrz kod poniżej) może na początku wyglądać ostro, ale:
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();
}