Reputation: 60556
How can I determine which operating system my .NET Core app is running on?
In the past I could use Environment.OSVersion
.
What is the current way to determine whether my app is running on Mac or Windows?
Upvotes: 204
Views: 105375
Reputation: 1168
Check System.OperatingSystem
class it has static methods for each OS i.e. IsMacOS()
, IsWindows()
, IsIOS()
and so on. These methods are available starting with .NET 5.
This makes it a great choice because the implementations for these methods use preprocessor directives to fix the return value to a constant true/false at compilation time for each target OS the OperatingSystem
class is compiled for. There is no runtime probing or calls to make.
Here is an excerpt from one such method in OperatingSystem
:
/// <summary>
/// Indicates whether the current application is running on Linux.
/// </summary>
[NonVersionable]
public static bool IsLinux() =>
#if TARGET_LINUX && !TARGET_ANDROID
true;
#else
false;
#endif
Upvotes: 70
Reputation: 60556
System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()
OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux
bool isWindows = System.Runtime.InteropServices.RuntimeInformation
.IsOSPlatform(OSPlatform.Windows);
Thanks to the comment by Oleksii Vynnychenko
You can get the operating systems name and version as a string using
var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription;
E.g. osNameAndVersion
would be Microsoft Windows 10.0.10586
Upvotes: 311
Reputation: 12108
System.Environment.OSVersion.Platform
can be used in full .NET Framework and Mono but:
System.Runtime.InteropServices.RuntimeInformation
can be used in .NET Core but:
You could pinvoke platform specific unmanaged functions such as uname()
but:
So my suggested solution (see code bellow) may look sily at first but:
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();
}
Upvotes: 50