Determine Operating System in .NET Core

Method

System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()

Possible Argument

OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux

Example

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


System.Environment.OSVersion.Platform can be used in full .NET Framework and Mono but:

  • 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;
    }
    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();
}