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. osNameAndVersionByłobyMicrosoft Windows 10.0.10586
System.Runtime.InteropServices.RuntimeInformation.OSDescription- zwraca opis systemu operacyjnego z wersją itp.
System.Environment.OSVersion.Platformdla 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();
}