0Day Forums
Determine Operating System in .NET Core - Printable Version

+- 0Day Forums (https://zeroday.vip)
+-- Forum: Coding (https://zeroday.vip/Forum-Coding)
+--- Forum: C# (https://zeroday.vip/Forum-C)
+--- Thread: Determine Operating System in .NET Core (/Thread-Determine-Operating-System-in-NET-Core)



Determine Operating System in .NET Core - bontequaggaabcpiqniz - 07-24-2023

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?


RE: Determine Operating System in .NET Core - contestless945911 - 07-24-2023

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




RE: Determine Operating System in .NET Core - stadtholder707 - 07-24-2023

## 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`


RE: Determine Operating System in .NET Core - phlebotomeokdkp - 07-24-2023

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`:

```c#
/// <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