在.NET 内核中确定操作系统

如何确定.NETCore 应用程序运行在哪个操作系统上? 在过去我可以使用 Environment.OSVersion

当前确定我的应用程序是在 Mac 还是 Windows 上运行的方法是什么?

76478 次浏览

方法

System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()

可能的争论

OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux

例子

bool isWindows = System.Runtime.InteropServices.RuntimeInformation
.IsOSPlatform(OSPlatform.Windows);

更新

感谢 Oleksii Vynnychenko 的评论

您可以使用以下命令获取操作系统名称和版本作为字符串

var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription;

例如,osNameAndVersion就是 Microsoft Windows 10.0.10586

System.Environment.OSVersion.Platform可以完全使用.NET Framework 和 Mono,但是:

  • 在 Mono 环境下,Mac OS X 检测几乎不起作用
  • 它不是在.NETCore 中实现的

System.Runtime.InteropServices.RuntimeInformation可以在.NET Core 中使用,但是:

  • 它没有在完整的.NETFramework 和 Mono 中实现
  • 它在运行时不执行平台检测,而是执行 而是使用硬编码信息
    (详情请参阅 COREFX 第3032期)

您可以调用特定于平台的非托管函数,如 uname(),但是:

  • 它可能会在未知的平台上引起内存区段错误
  • 在某些项目中是不允许的

因此,我建议的解决方案(见下面的代码)乍看起来可能有点傻,但是:

  • 它使用100% 托管代码
  • 它适用于.NET,Mono 和.NET Core
  • 到目前为止,它在 Pkcs11Interop图书馆里运作得非常好
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();
}

检查 System.OperatingSystem类,它对每个操作系统都有静态方法,例如 IsMacOS()IsWindows()IsIOS()等等。这些方法从以下开始可用。NET 5.