Определить операционную систему в.NET Core
Как определить, в какой операционной системе работает мое приложение.NET Core? В прошлом я мог использовать Environment.OSVersion
,
Как в настоящее время определить, работает ли мое приложение на Mac или Windows?
3 ответа
метод
System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()
Возможный аргумент
OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux
пример
bool isWindows = System.Runtime.InteropServices.RuntimeInformation
.IsOSPlatform(OSPlatform.Windows)
Обновить
Благодаря комментарию Алексея Винниченко
Вы можете получить имя и версию операционной системы в виде строки, используя
var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription
Например osNameAndVersion
было бы Microsoft Windows 10.0.10586
Проверять
System.OperatingSystem
class он имеет статические методы для каждой ОС, то есть IsMacOS(), IsWindows(), IsIOS() и так далее.
System.Environment.OSVersion.Platform
может использоваться в полной версии.NET Framework и Mono, но:
- Обнаружение Mac OS X почти никогда не работало для меня под Mono
- это не реализовано в.NET Core
System.Runtime.InteropServices.RuntimeInformation
можно использовать в.NET Core, но:
- он не реализован полностью.NET Framework и Mono
- он не выполняет определение платформы во время выполнения, а вместо этого использует жестко закодированную информацию
(см. corefx выпуск № 3032 для более подробной информации)
Вы можете определить неуправляемые функции, специфичные для платформы, например: uname()
но:
- это может вызвать ошибку сегментации на неизвестных платформах
- не допускается в некоторых проектах
Таким образом, моё предлагаемое решение (см. Код ниже) на первый взгляд может показаться хитрым, но:
- он использует 100% управляемый код
- это работает в.NET, Mono и.NET Core
- до сих пор это работает как прелесть в библиотеке Pkcs11Interop
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();
}