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

Comment puis-je déterminer sur quel système d’exploitation mon application .NET Core est exécutée? Dans le passé, je pouvais utiliser Environment.OSVersion .

Quel est le moyen actuel de déterminer si mon application s’exécute sur Mac ou Windows?

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) 

Mettre à jour

Merci au commentaire d’Oleksii Vynnychenko

Vous pouvez obtenir le nom et la version du système d’exploitation sous forme de chaîne en utilisant

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

Par exemple, osNameAndVersion serait Microsoft Windows 10.0.10586

System.Environment.OSVersion.Platform peut être utilisé dans .NET Framework complet et Mono mais:

  • La détection de Mac OS X n’a ​​presque jamais fonctionné 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 .NET Framework complet et Mono
  • il n’effectue pas de détection de plate-forme à l’exécution, mais utilise plutôt des informations codées en dur
    (voir le numéro de corefx 3032 pour plus de détails)

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

  • il peut provoquer une erreur de segmentation sur des plates-formes inconnues
  • n’est pas autorisé dans certains projets

Donc, ma solution suggérée (voir code ci-dessous) peut sembler sournoise au début mais:

  • il utilise du code géré à 100%
  • il fonctionne dans .NET, Mono et .NET Core
  • cela fonctionne comme un charme jusqu’à présent dans la bibliothèque Pkcs11Interop
 ssortingng windir = Environment.GetEnvironmentVariable("windir"); if (!ssortingng.IsNullOrEmpty(windir) && windir.Contains(@"\") && Directory.Exists(windir)) { _isWindows = true; } else if (File.Exists(@"/proc/sys/kernel/ostype")) { ssortingng osType = File.ReadAllText(@"/proc/sys/kernel/ostype"); if (osType.StartsWith("Linux", SsortingngComparison.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(); }