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?
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
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 ...
Antworten:
Methode
Mögliches Argument
Beispiel
Aktualisieren
Dank des Kommentars von Oleksii Vynnychenko
Sie können den Namen und die Version des Betriebssystems als Zeichenfolge abrufen
ZB
osNameAndVersion
wäreMicrosoft Windows 10.0.10586
quelle
System.Runtime.InteropServices.RuntimeInformation.OSDescription
System.Environment.OSVersion.Platform
Konsistenz implementieren ?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 .System.Environment.OSVersion.Platform
kann in vollem .NET Framework und Mono verwendet werden, aber:System.Runtime.InteropServices.RuntimeInformation
kann in .NET Core verwendet werden, aber:( weitere Informationen finden Sie in der CoreFX-Ausgabe Nr. 3032 ).
Sie könnten plattformspezifische, nicht verwaltete Funktionen wie
uname()
:Meine vorgeschlagene Lösung (siehe Code unten) mag zunächst schlau aussehen, aber:
quelle