Bestimmen Sie das Betriebssystem in .NET Core

118

Wie kann ich feststellen, auf welchem ​​Betriebssystem meine .NET Core-App ausgeführt wird? In der Vergangenheit konnte ich verwenden Environment.OSVersion.

Wie kann ich derzeit feststellen, ob meine App auf Mac oder Windows ausgeführt wird?

dknaack
quelle
stackoverflow.com/a/28664021/1009099 siehe dies
Kovpaev Alexey
Nicht wirklich die Antwort, nach der ich gesucht habe, aber ich habe sie selbst gefunden.
dknaack
Lesen
Satinder singh

Antworten:

184

Methode

System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()

Mögliches Argument

OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux

Beispiel

bool isWindows = System.Runtime.InteropServices.RuntimeInformation
                                               .IsOSPlatform(OSPlatform.Windows);

Aktualisieren

Dank des Kommentars von Oleksii Vynnychenko

Sie können den Namen und die Version des Betriebssystems als Zeichenfolge abrufen

var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription;

ZB osNameAndVersionwäreMicrosoft Windows 10.0.10586

dknaack
quelle
4
Sie können dies hinzufügen, um weitere Informationen zum Betriebssystem zu System.Runtime.InteropServices.RuntimeInformation.OSDescription
erhalten. Dieses
15
+1 obwohl mir diese Antwort nicht gefällt. Warum können sie nicht einfach aus Gründen der System.Environment.OSVersion.PlatformKonsistenz implementieren ?
Leppie
2
Beachten Sie, dass die Konstanten nicht alle unterstützten Betriebssysteme darstellen. Es ist möglich, nach anderen Betriebssystemen zu suchen, indem verwendet wird, IsOSPlatform(OSPlatform.Create("FreeBSD"))ob diese jetzt unterstützt werden oder in Zukunft hinzugefügt werden können. Es ist jedoch nicht sehr klar, was ein sicherer Ansatz für die zu übergebenden Zeichenfolgen wäre (z. B. spielt der Fall eine Rolle oder passt "bsd"er zu beiden "FreeBSD"und "NetBSD"?). Siehe Diskussion zu dieser Funktion hier .
NightOwl888
37

System.Environment.OSVersion.Platform kann in vollem .NET Framework und Mono verwendet werden, aber:

  • Die Mac OS X-Erkennung hat unter Mono bei mir fast nie funktioniert
  • Es ist nicht in .NET Core implementiert

System.Runtime.InteropServices.RuntimeInformation kann in .NET Core verwendet werden, aber:

  • Es ist nicht vollständig in .NET Framework und Mono implementiert
  • Es führt zur Laufzeit keine Plattformerkennung durch, sondern verwendet stattdessen fest codierte Informationen
    ( weitere Informationen finden Sie in der CoreFX-Ausgabe Nr. 3032 ).

Sie könnten plattformspezifische, nicht verwaltete Funktionen wie uname():

  • Auf unbekannten Plattformen kann dies zu Segmentierungsfehlern führen
  • ist in einigen Projekten nicht erlaubt

Meine vorgeschlagene Lösung (siehe Code unten) mag zunächst schlau aussehen, aber:

  • Es wird 100% verwalteter Code verwendet
  • Es funktioniert in .NET, Mono und .NET Core
  • In der Pkcs11Interop- Bibliothek funktioniert es bisher wie ein Zauber
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();
}
jariq
quelle
1
Schätzen Sie für Ihre Mühe. Ich wünschte, es könnte in Zukunft eine gewisse Konsistenz geben.
Leppie
6
System.Runtime.InteropServices.RuntimeInformation sollte jetzt (seit November) in .net vollständig funktionieren, so dass dies jetzt der akzeptierte "richtige" Weg zu sein scheint. Ich bin mir bei Mono nicht sicher, aber da sie jetzt, da es Open Source ist, Code direkt von .net beziehen, ist es nur eine Frage der Zeit, bis er dort funktioniert, wenn nicht bereits.
GrandOpener
1
Path.DirectorySeparatorChar Kann verwendet werden, um festzustellen, ob es sich um einen Windows- oder * nix-Computer handelt.
Kiran
InteropServices sind sehr seltsam. In VStudio und Rider wird manchmal "In diesem Kontext unbekannt" angezeigt oder es wird kompiliert. Keine Ahnung über den Grund dieses Versagens ...
Slesa