【问题标题】:Determine Operating System in .NET Core确定 .NET Core 中的操作系统
【发布时间】:2016-12-11 23:04:58
【问题描述】:

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

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

【问题讨论】:

标签: c# .net-core


【解决方案1】:

方法

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.Runtime.InteropServices.RuntimeInformation.OSDescription - 返回操作系统的描述以及版本等。
  • +1 虽然我不喜欢这个答案。为什么他们不能只实现System.Environment.OSVersion.Platform 以保持一致性?
  • 请注意,这些常量并不代表所有受支持的操作系统。可以通过使用IsOSPlatform(OSPlatform.Create("FreeBSD")) 来探测其他操作系统是现在支持还是将来可能添加。但是,对于要传递哪些字符串的安全方法不是很清楚(例如,大小写是否重要,或者"bsd" 是否同时匹配"FreeBSD""NetBSD"?)。请参阅有关此功能的讨论 here
  • 当心! RuntimeInformation.IsOSPlatform 不查看当前操作系统,而是检查构建配置目标。证明:github.com/dotnet/runtime/blob/…检查这个答案stackoverflow.com/a/66618677/56621
【解决方案2】:

System.Environment.OSVersion.Platform 可以在完整的 .NET Framework 和 Mono 中使用,但是:

  • Mac OS X 检测在 Mono 下对我几乎不起作用
  • 它没有在 .NET Core 中实现

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

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

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

  • 可能会导致未知平台上的分段错误
  • 在某些项目中不允许

所以我建议的解决方案(见下面的代码)一开始可能看起来很傻,但是:

  • 它使用 100% 托管代码
  • 它适用于 .NET、Mono 和 .NET Core
  • 到目前为止,它在 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();
}

【讨论】:

  • 感谢您的努力。希望未来可以保持一致。
  • System.Runtime.InteropServices.RuntimeInformation 现在应该在完整的 .net 中正常工作(自 11 月以来),所以这似乎是现在公认的“正确”方式。不确定 mono,但由于他们直接从 .net 获取一些代码,因为它是开源的,所以它在那里工作只是时间问题,如果还没有的话。
  • Path.DirectorySeparatorChar 可以用来判断它是windows还是*nix机器。
  • InteropServices 很奇怪。在 VStudio 和 Rider 中,我有时会得到“在此上下文中未知”或编译。不知道这次失败的原因......
【解决方案3】:

检查System.OperatingSystem 类,它对每个操作系统都有静态方法,即 IsMacOS()、IsWindows()、IsIOS() 等。

【讨论】:

  • 这应该是最佳答案
猜你喜欢
  • 1970-01-01
  • 2019-04-13
  • 2013-01-02
  • 1970-01-01
  • 2010-12-21
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多