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

Как проверить версию ОС во время выполнения, например. windows или linux без использования оператора условной компиляции

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

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

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

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

#if (LINUX)
 ' do something
#endif

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

Спасибо заранее.

4b9b3361

Ответ 1

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

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

Из Моно 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.

Ответ 2

Как насчет

System.Environment.OSVersion

Ответ 3

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

Ответ 4

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

Ответ 5

Я нашел эту рекомендацию в одном из блогов 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.