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.

2voto

Joel Coehoorn Points 190579

Pour développer d'autres réponses, dans les cas où les implémentations Linux et Windows d'une fonctionnalité ne sont pas compatibles (c'est-à-dire qu'elles nécessitent des références à des bibliothèques disponibles uniquement pour une plateforme spécifique), vous pouvez également utiliser une interface et avoir deux assemblages séparés, un écrit et compilé sur chaque plateforme, avec un type qui implémente cette interface.

Ensuite, en fonction de la vérification, utilisez Assembly.Load() pour charger uniquement le bon assemblage (et sa dépendance spécifique à la plate-forme), reflection pour trouver votre type dans l'assemblage, et Activator.CreateInstance() pour obtenir une instance du type avec laquelle vous pouvez ensuite travailler normalement.

1voto

Dixin Points 21

Statique intégrée System.Runtime.Serialization.OperatingSystem.IsLinux() .

0voto

Zane Claes Points 4001

Une autre option consiste à utiliser Process pour appeler un shell script afin d'obtenir la uname comme suit :

Process p = new Process {
  StartInfo = {
    UseShellExecute        = false,
    RedirectStandardOutput = true,
    FileName               = "uname",
    Arguments              = "-s"
  }
};
p.Start();
string uname = p.StandardOutput.ReadToEnd().Trim();

if (uname == "Darwin") {
  // OS X
} else {
  // ...
}

0voto

Ahmed Naeem Points 48
OperatingSystem os = new OperatingSystem(System.Environment.OSVersion.Platform, new Version());
Console.WriteLine(os.ToString());

0voto

Kailash Mali Points 21

Avec l'aide de la bibliothèque TimeZoneConverter, il est possible de faire correspondre le fuseau horaire de Google avec celui de Windows. Cette bibliothèque est compatible avec Windows, Linux et la plupart des systèmes.

using TimeZoneConverter;
//Convert Google's Time zone Id into Standard Time Zone name using TimeZoneConvertor library's method named 'GetTimeZoneInfo'
Input : Asia/Hong_Kong 
Output : China Standard Time
TimeZoneInfo tz = TZConvert.GetTimeZoneInfo(timeZoneId);

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