Визначте операційну систему в .NET Core


118

Як я можу визначити, на якій операційній системі працює мій додаток .NET Core? У минулому я міг користуватися Environment.OSVersion.

Який поточний спосіб визначити, чи працює моя програма на Mac чи Windows?



Не дуже відповідь, яку я шукав, але знайшов її сам.
dknaack

Перегляньте цю статтю codepedia.info/…
Satinder singh

Відповіді:


184

Метод

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


4
Ви можете додати, що для отримання додаткової інформації про ОС є ще одна властивість цього пакета: System.Runtime.InteropServices.RuntimeInformation.OSDescription- повертає опис ОС з версією тощо
Олексій Винниченко

15
+1, хоча мені ця відповідь не подобається. Чому не можна їх просто реалізувати System.Environment.OSVersion.Platformдля послідовності?
леппі

2
Зауважте, що константи не представляють усіх підтримуваних ОС. Можна зондувати для інших ОС, використовуючи IsOSPlatform(OSPlatform.Create("FreeBSD")), підтримуються вони зараз чи можуть бути додані в майбутньому. Однак, не дуже зрозуміло, яким би був безпечний підхід до того, які рядки проходять (наприклад, чи має значення випадок, чи "bsd"збігається і те, "FreeBSD"і інше "NetBSD"?). Дивіться обговорення цієї функції тут .
NightOwl888

37

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();
}

1
Вдячний за ваші зусилля. Бажаючи, що в майбутньому може бути певна послідовність.
леппі

6
System.Runtime.InteropServices.RuntimeInformation має працювати коректно в повному обсязі .net зараз (з листопада), так що, здається, зараз прийнятий "правильний" шлях. Не впевнені в моно, але оскільки вони беруть якийсь код прямо з .net тепер, коли він є відкритим кодом, це лише питання часу, поки він буде працювати там, якщо ще не.
GrandOpener

1
Path.DirectorySeparatorChar Можна використовувати, щоб визначити, чи є він Windows або * nix машиною.
кіран

Сервіси Interop дуже дивні. У VStudio та Rider я іноді отримую "Невідомо в цьому контексті" або він компілюється. Не маю уявлення про причину цієї невдачі ...
Slesa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.