Определить операционную систему в.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();
}
Другие вопросы по тегам