Jak sprawdzić wersję systemu operacyjnego w czasie pracy np. windows lub linux bez użycia instrukcji kompilacji warunkowej

Czy ktoś wie jak określić na jakiej platformie działa twój kod c# np. czy działa na Linuksie czy Windowsie, żebym mógł wykonać inny kod w czasie wykonywania.

Mam aplikację c # windows, którą chcę zbudować na platformy windows i linux.

Do tej pory stworzyłem 2 pliki projektu wskazujące na ten sam zestaw plików kodu źródłowego. Następnie używam warunkowej instrukcji kompilacji jednego z projektów o nazwie LINUX.

Gdzie występują różnice w actual code I use coditional statements using the conditional compilation statement, e. g

#if (LINUX)
 ' do something
#endif
Czy jest na to lepszy sposób? Nie chcę mieć 2 plików projektu. Z góry dzięki.
Author: H.B., 2011-02-25

5 answers

Możesz wykryć platformę wykonawczą za pomocą System.Environment.OSVersion.Platform:

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

Z mono FAQ :

Jak wykryć platformę realizacji ?

Platformę wykonawczą można wykryć za pomocą wartości System.Environment.OSVersion.Platform. Jednak prawidłowe wykrywanie platform uniksowych w każdym przypadku wymaga trochę więcej pracy. Pierwsze wersje frameworka (1.0 i 1.1) nie zawierały żadnej PlatformID wartości dla Uniksa, więc mono użyło wartości 128. Nowszy framework 2.0 dodał Unix do platformy enum, ale, niestety, z inną wartością: 4 i nowsze wersje. NET rozróżnia Unix i MacOS X, wprowadzając jeszcze jedną wartość 6 dla MacOS X.

Oznacza to, że aby poprawnie wykryć kod działający na platformach Unix należy sprawdzić trzy wartości (4, 6 i 128). Zapewnia to, że kod detekcji będzie działał zgodnie z oczekiwaniami po wykonaniu na Mono CLR 1.x runtime oraz z mono i Microsoft CLR 2.x runtimes.

 67
Author: Martin Buberl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-26 11:12:27

A może

System.Environment.OSVersion
 8
Author: Andreas Ågren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-25 12:04:55

Znalazłem tę rekomendację na jednym z blogów Microsoftu:

Zalecamy korzystanie z RuntimeInformation.IsOSPlatform () dla platformy czeki.

Odniesienie: https://blogs.msdn.microsoft.com/dotnet/2017/11/16/announcing-the-windows-compatibility-pack-for-net-core/

IsOSPlatform() pobiera argument typu OSPlatform, który domyślnie ma 3 wartości: Windows, Linux i OSX. Może być stosowany w następujący sposób:

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

API jest częścią Standardu. NET 2.0, a więc dostępne w. Net Core 2.0 i. NET Framework 4.7.1.

 8
Author: Alex Sanséau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-20 10:53:19

Możesz użyć System.Environment.OSVersion, aby sprawdzić, na jakiej platformie jesteś w czasie wykonywania.

 3
Author: Samuel Otter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 12:18:48

Aby rozszerzyć inne odpowiedzi, w przypadkach, gdy implementacja funkcji dla Linuksa i windows nie jest zgodna (np. wymaga referencji do bibliotek dostępnych tylko dla konkretnej platformy), można również użyć interfejsu i mieć dwa oddzielne zespoły, jeden napisany i skompilowany na każdej platformie, z typem, który implementuje ten interfejs. Następnie, na podstawie sprawdzenia, użyj Assembly.Load (), aby załadować tylko właściwy zespół (i jest to zależność specyficzna dla platformy), reflection, aby znaleźć swój typ w montaż i aktywator.CreateInstance (), aby uzyskać instancję typu, z którą można normalnie pracować.

 2
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-20 03:41:34