`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](
[To see links please register here]
) 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](
[To see links please register here]
) library
<!-- language: lang-cs -->
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();
}