107 votes

Comment vérifier la version du système d'exploitation au moment de l'exécution, par exemple sous Windows ou Linux, sans utiliser une instruction de compilation conditionnelle ?

Comment puis-je déterminer la plate-forme sur laquelle mon code C# s'exécute ? Par exemple, s'il s'exécute sur Linux ou Windows, afin que je puisse exécuter un code différent au moment de l'exécution.

J'ai une application Windows C# que je souhaite développer pour les plates-formes Windows et Linux.

Jusqu'à présent, j'ai créé deux fichiers de projet pointant vers le même ensemble de fichiers de code source. J'utilise ensuite une instruction de compilation conditionnelle pour l'un des projets appelé LINUX .

Lorsqu'il y a des différences dans le code réel, j'utilise des instructions conditionnelles en utilisant l'instruction de compilation conditionnelle, par exemple,

#if (LINUX)
    ' Do something
#endif

Existe-t-il une meilleure façon de procéder ? Je ne veux pas vraiment avoir deux fichiers de projet.

166voto

Alex Sanséau Points 3348

J'ai trouvé cette recommandation sur l'un des blogs de Microsoft :

Nous vous recommandons d'utiliser RuntimeInformation.IsOSPlatform() pour vérifier la plate-forme. de la plate-forme.

Référence : Annonce du pack de compatibilité Windows pour .NET Core

IsOSPlatform() prend un argument de type OSPlatform qui a trois valeurs par défaut : Windows , Linux y OSX . Il peut être utilisé comme suit :

if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
  // Do something
}

L'API fait partie de la norme .NET 2.0 et est donc disponible dans .NET Core 2.0 et .NET Framework 4.7.1.

87voto

Martin Buberl Points 14573

[ Note de la rédaction : Cette réponse était applicable avant .NET 4.7.1, ou avant la sortie du Windows Compatibility Pack for .NET Core. La meilleure réponse actuelle est Alex Sanséau's à la question de Stack Overflow Comment vérifier la version du système d'exploitation au moment de l'exécution, par exemple sous Windows ou Linux, sans utiliser une instruction de compilation conditionnelle ? .]

Vous pouvez détecter la plate-forme d'exécution en utilisant System.Environment.OSVersion.Platform :

public static bool IsLinux
{
    get
    {
        int p = (int) Environment.OSVersion.Platform;
        return (p == 4) || (p == 6) || (p == 128);
    }
}

A partir de la FAQ Mono :

Comment détecter la plate-forme d'exécution

La plate-forme d'exécution peut être détectée à l'aide de la fonction System.Environment.OSVersion.Platform valeur. Cependant, la détection correcte des plates-formes Unix, dans tous les cas, nécessite un peu plus de travail. Les premières versions du framework (1.0 et 1.1) n'incluaient pas de fonction PlatformID pour Unix, Mono a donc utilisé la valeur 128. Le framework 2.0, plus récent, a ajouté Unix à l'énumération PlatformID mais, malheureusement, avec une valeur différente : 4 et les versions plus récentes de .NET ont fait la distinction entre Unix et macOS, en introduisant une autre valeur 6 pour macOS.

Cela signifie que pour détecter correctement un code fonctionnant sur des plates-formes Unix, vous devez vérifier les trois valeurs (4, 6 et 128). Cela garantit que le code de détection fonctionnera comme prévu lorsqu'il est exécuté avec le moteur d'exécution Mono CLR 1.x et avec les moteurs d'exécution Mono et Microsoft CLR 2.x.

14voto

Alper Ebicoglu Points 2977

Cette méthode n'existe pas, mais vous pouvez utiliser cette méthode qui la vérifie de manière conditionnelle :

    public static OSPlatform GetOperatingSystem()
    {
        if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
        {
            return OSPlatform.OSX;
        }

        if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            return OSPlatform.Linux;
        }

        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            return OSPlatform.Windows;
        }

        throw new Exception("Cannot determine operating system!");
    }

13voto

Andreas Ågren Points 1758

Úsalo:

System.Environment.OSVersion

3voto

ADeweyan Points 56

Vous pouvez utiliser System.Environment.OSVersion pour vérifier le type de plateforme sur laquelle vous vous trouvez au moment de l'exécution.

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