Как проверить версию ОС во время выполнения, например, Windows или Linux, без использования оператора условной компиляции - PullRequest
36 голосов
/ 25 февраля 2011

Кто-нибудь знает, как определить, на какой платформе работает ваш код C #, например? работает ли он в Linux или Windows, чтобы я мог выполнять другой код во время выполнения.

У меня есть приложение на c # для Windows, которое я хочу создать для целевых платформ Windows и Linux.

До сих пор я создал 2 файла проекта, указывающих на один и тот же набор файлов исходного кода. Затем я использую оператор условной компиляции одного из проектов под названием LINUX.

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

#if (LINUX)
 ' do something
#endif

Есть ли лучший способ сделать это? Я действительно не хочу иметь 2 файла проекта.

Заранее спасибо.

Ответы [ 6 ]

73 голосов
/ 25 февраля 2011

Вы можете обнаружить платформу выполнения, используя System.Environment.OSVersion.Platform:

public static bool IsLinux
{
    get
    {
        int p = (int) Environment.OSVersion.Platform;
        return (p == 4) || (p == 6) || (p == 128);
    }
}

Из Mono FAQ :

Как обнаружитьПлатформа выполнения?

Платформу выполнения можно определить с помощью значения System.Environment.OSVersion.Platform.Однако для правильного определения платформ Unix в каждом случае требуется немного больше работы.В первых версиях платформы (1.0 и 1.1) не было никакого значения PlatformID для Unix, поэтому Mono использовал значение 128. Более новая платформа 2.0 добавила Unix к перечислению PlatformID, но, к сожалению, с другим значением: 4и более новые версии .NET различаются между Unix и MacOS X, представляя еще одно значение 6 для MacOS X.

Это означает, что для правильного определения кода, работающего на платформах Unix, необходимо проверить три значения (4,6 и 128).Это гарантирует, что код обнаружения будет работать должным образом при выполнении в среде выполнения Mono CLR 1.x и в средах выполнения Mono и Microsoft CLR 2.x.

26 голосов
/ 20 ноября 2017

Я нашел эту рекомендацию в одном из блогов Microsoft:

Мы рекомендуем использовать RuntimeInformation.IsOSPlatform () для проверок платформы.

Ссылка: https://blogs.msdn.microsoft.com/dotnet/2017/11/16/announcing-the-windows-compatibility-pack-for-net-core/

IsOSPlatform() принимает аргумент типов OSPlatform, который по умолчанию имеет 3 значения: Windows, Linux и OSX.Его можно использовать следующим образом:

if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
  // Do something
}

API является частью .NET Standard 2.0 и поэтому доступен в .NET Core 2.0 и .NET Framework 4.7.1.

9 голосов
/ 25 февраля 2011

Как насчет

System.Environment.OSVersion
3 голосов
/ 25 февраля 2011

Вы можете использовать System.Environment.OSVersion, чтобы проверить, на какой платформе вы находитесь во время выполнения.

2 голосов
/ 20 декабря 2011

Чтобы расширить другие ответы, в случаях, когда реализация функции в Linux и Windows несовместима (т. Е. Требуются ссылки на библиотеки, доступные только для конкретной платформы), вы также можете использовать интерфейс и иметь две отдельные сборки, один написан и скомпилирован на каждой платформе с типом, который реализует этот интерфейс. Затем, основываясь на проверке, используйте Assembly.Load () для загрузки только нужной сборки (и ее зависимости от платформы), отражения для поиска вашего типа в сборке и Activator.CreateInstance () для получения экземпляра типа с которым вы можете работать в обычном режиме.

0 голосов
/ 26 марта 2019

Еще одним вариантом является использование Process для вызова сценария оболочки для получения uname, как показано ниже:

Process p = new Process {
  StartInfo = {
    UseShellExecute        = false,
    RedirectStandardOutput = true,
    FileName               = "uname",
    Arguments              = "-s"
  }
};
p.Start();
string uname = p.StandardOutput.ReadToEnd().Trim();

if (uname == "Darwin") {
  // OSX
} else {
  // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...