Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
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?
bool isWindows = System.Runtime.InteropServices.RuntimeInformation
.IsOSPlatform(OSPlatform.Windows);
Update
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
–
–
–
–
Mac OS X detection almost never worked for me under Mono
it is not implemented in .NET Core
System.Runtime.InteropServices.RuntimeInformation
can be used in .NET Core but:
it is not implemented in full .NET Framework and Mono
it does not perform platform detection in runtime but uses hardcoded information instead
(see corefx issue #3032 for more details)
You could pinvoke platform specific unmanaged functions such as uname()
but:
it may cause segmentation fault on unknown platforms
is not allowed in some projects
So my suggested solution (see code bellow) may look sily at first but:
it uses 100% managed code
it works in .NET, Mono and .NET Core
it works like a charm so far in Pkcs11Interop library
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;
throw new UnsupportedPlatformException(osType);
else if (File.Exists(@"/System/Library/CoreServices/SystemVersion.plist"))
// Note: iOS gets here too
_isMacOsX = true;
throw new UnsupportedPlatformException();
–
–
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
–
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.