确定.NET Core中的操作系统

dkn*_*ack 93 c# .net-core

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

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

dkn*_*ack 152

方法

System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()
Run Code Online (Sandbox Code Playgroud)

可能的争论

OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux
Run Code Online (Sandbox Code Playgroud)

bool isWindows = System.Runtime.InteropServices.RuntimeInformation
                                               .IsOSPlatform(OSPlatform.Windows);
Run Code Online (Sandbox Code Playgroud)

更新

感谢Oleksii Vynnychenko的评论

您可以使用操作系统名称和版本作为字符串

var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription;
Run Code Online (Sandbox Code Playgroud)

例如,osNameAndVersionMicrosoft Windows 10.0.10586

  • +1虽然我不喜欢这个答案.为什么他们不能只实现`System.Environment.OSVersion.Platform`以保持一致性? (14认同)
  • 谨防!`RuntimeInformation.IsOSPlatform` 不会查看当前操作系统,而是检查构建配置目标。证明:https://github.com/dotnet/runtime/blob/57bfe474518ab5b7cfe6bf7424a79ce3af9d6657/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs#L91检查这个答案https://stackoverflow.com/a/ 66618677/56621 (5认同)
  • 您可以添加它以获取有关OS的更多信息,该包中还有另一个属性:`System.Runtime.InteropServices.RuntimeInformation.OSDescription`-返回带有版本等信息的OS描述。 (2认同)
  • 请注意,常量不代表所有支持的操作系统.可以使用`IsOSPlatform(OSPlatform.Create("FreeBSD"))来探测其他操作系统,无论它们现在是否受支持,或者将来可能会被添加.然而,对于传递什么字符串是一种安全的方法还不是很清楚(例如,情况如何,或者"bsd"`匹配"FreeBSD"和"NetBSD"?).请参阅有关此功能的讨论[此处](https://github.com/dotnet/corefx/issues/1017). (2认同)

jar*_*riq 33

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

  • 在Mono下,Mac OS X检测几乎从未对我有用
  • 它没有在.NET Core中实现

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

  • 它没有在完整的.NET Framework和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();
}
Run Code Online (Sandbox Code Playgroud)

  • System.Runtime.InteropServices.RuntimeInformation现在应该在完整的.net(从11月开始)正常工作,所以这似乎是现在接受的"正确"方式.不确定单声道,但由于它们直接从.net获取一些代码,因为它是开源的,它在那里工作只是时间问题,如果还没有的话. (6认同)
  • Path.DirectorySeparatorChar 可用于确定它是 Windows 还是 *nix 机器。 (3认同)

Sam*_*tak 5

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

  • 这应该是最佳答案 (6认同)