Подтвердить что ты не робот

Определение операционной системы в .NET Core

Как определить, на какой операционной системе работает мое сетевое приложение .net? В прошлом я мог использовать Environment.OSVersion.

Каков текущий способ определить, работает ли мое приложение на Mac или Windows.

4b9b3361

Ответ 1

Метод

System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()

Возможный аргумент

OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux

Пример

bool isWindows = System.Runtime.InteropServices.RuntimeInformation
                                               .IsOSPlatform(OSPlatform.Windows)

Update

Благодаря комментарию Алексея Винниченко

Вы можете получить имя и версию операционной системы в виде строки, используя

var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription

например. osNameAndVersion будет Microsoft Windows 10.0.10586

Ответ 2

System.Environment.OSVersion.Platform можно использовать в полной версии .NET Framework и Mono, но:

  • Обнаружение Mac OS X почти никогда не работало для меня в Mono
  • он не реализован в .NET Core

System.Runtime.InteropServices.RuntimeInformation может использоваться в .NET Core, но:

  • он не реализован в полной версии .NET Framework и Mono
  • он не выполняет обнаружение платформы во время выполнения, но использует жестко кодированную информацию вместо
    (подробнее см. corefx issue # 3032)

Вы могли бы вызывать специальные неуправляемые функции платформы, такие как uname(), но:

  • это может привести к ошибке сегментации на неизвестных платформах.
  • не разрешено в некоторых проектах

Итак, мое предложенное решение (см. ниже код) может выглядеть сильным сначала, но:

  • использует 100% управляемый код
  • он работает в .NET, Mono и .NET Core
  • он работает как прелесть до сих пор в Pkcs11Interop library
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();
}