135 votes

Déterminer le système d'exploitation dans .NET Core

Comment puis-je déterminer sur quel système d'exploitation fonctionne mon application .NET Core ? Dans le passé, je pouvais utiliser Environment.OSVersion .

Quel est le moyen actuel de déterminer si mon application fonctionne sur Mac ou sur Windows ?

0 votes

0 votes

Ce n'est pas vraiment la réponse que je cherchais, mais je l'ai trouvée par moi-même.

220voto

dknaack Points 26873

Méthode

System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()

Argument possible

OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux

Exemple

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

Mise à jour

Merci au commentaire d'Oleksii Vynnychenko.

Vous pouvez obtenir le nom et la version du système d'exploitation sous la forme d'une chaîne de caractères en utilisant la méthode suivante

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

Par exemple osNameAndVersion serait Microsoft Windows 10.0.10586

4 votes

Vous pouvez l'ajouter pour obtenir plus d'informations sur le système d'exploitation d'un autre bien dans ce paquet : System.Runtime.InteropServices.RuntimeInformation.OSDescript‌​ion - renvoie la description du système d'exploitation avec sa version, etc.

15 votes

+1 bien que je n'aime pas cette réponse. Pourquoi ne peuvent-ils pas simplement mettre en œuvre System.Environment.OSVersion.Platform pour la cohérence ?

2 votes

Notez que les constantes ne représentent pas tous les systèmes d'exploitation supportés. Il est possible de rechercher d'autres systèmes d'exploitation en utilisant la fonction IsOSPlatform(OSPlatform.Create("FreeBSD")) s'ils sont pris en charge actuellement ou s'ils peuvent être ajoutés à l'avenir. Cependant, il n'est pas très clair quelle serait une approche sûre pour les chaînes à passer (par exemple, est-ce que la casse compte, ou bien est-ce que "bsd" correspondent aux deux "FreeBSD" y "NetBSD" ?). Voir la discussion sur cette fonctionnalité aquí .

42voto

jariq Points 7403

System.Environment.OSVersion.Platform peut être utilisé dans l'intégralité de .NET Framework et Mono mais :

  • La détection Mac OS X n'a presque jamais fonctionné pour moi sous Mono.
  • il n'est pas implémenté dans .NET Core

System.Runtime.InteropServices.RuntimeInformation peut être utilisé dans .NET Core mais :

  • il n'est pas implémenté dans l'intégralité de .NET Framework et Mono
  • il n'effectue pas la détection de la plate-forme en cours d'exécution mais utilise des informations codées en dur à la place
    (voir numéro 3032 de corefx pour plus de détails)

Vous pourriez invoquer des fonctions non gérées spécifiques à la plate-forme, telles que uname() mais :

  • il peut provoquer un défaut de segmentation sur des plateformes inconnues
  • n'est pas autorisé dans certains projets

La solution que je propose (voir le code ci-dessous) peut sembler simple au premier abord, mais.. :

  • il utilise un code géré à 100 %.
  • Il fonctionne avec .NET, Mono et .NET Core.
  • il fonctionne comme un charme jusqu'à présent dans Pkcs11Interop bibliothèque

    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(); }

1 votes

J'apprécie vos efforts. J'espère qu'il y aura un peu de cohérence à l'avenir.

8 votes

System.Runtime.InteropServices.RuntimeInformation devrait fonctionner correctement en .net complet maintenant (depuis novembre), donc cela semble être la "bonne" méthode acceptée maintenant. Je ne suis pas sûr de mono, mais comme ils prennent du code directement de .net maintenant qu'il est open source, ce n'est qu'une question de temps avant que cela fonctionne, si ce n'est déjà fait.

1 votes

Path.DirectorySeparatorChar Peut être utilisé pour déterminer s'il s'agit d'une machine Windows ou *nix.

2voto

Sameer Vartak Points 131

Vérifiez System.OperatingSystem Elle possède des méthodes statiques pour chaque système d'exploitation, à savoir IsMacOS(), IsWindows(), IsIOS() et ainsi de suite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X