web-dev-qa-db-fra.com

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

Comment déterminer le système d'exploitation sur lequel mon application .NET Core s'exécute? Dans le passé, je pouvais utiliser Environment.OSVersion.

Quel est le moyen actuel de déterminer si mon application est en cours d'exécution sur Mac ou Windows?

84
dknaack

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 de Oleksii Vynnychenko

Vous pouvez obtenir le nom et la version du système d'exploitation sous forme de chaîne à l'aide de

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

Par exemple. osNameAndVersion serait Microsoft Windows 10.0.10586

138
dknaack

System.Environment.OSVersion.Platform peut être utilisé intégralement en .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é intégralement .NET Framework et Mono
  • il ne détecte pas la plate-forme au moment de l'exécution, mais utilise à la place des informations codées en dur
    (voir numéro de corefx n ° 3032 pour plus de détails)

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

  • cela peut causer une erreur de segmentation sur des plateformes inconnues
  • n'est pas autorisé dans certains projets

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

  • il utilise 100% de code géré
  • cela fonctionne dans .NET, Mono et .NET Core
  • cela fonctionne comme un charme jusqu'ici 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();
}
31
jariq