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. 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 żadnejPlatformID
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.
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
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.
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.
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ć.
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