如何正确检测Windows、Linux和Mac操作系统

24

我找不到一个真正有效的方法来正确检测我的C#程序运行在哪个平台上(Windows / Linux / Mac),特别是在Mac上返回Unix,很难与Linux平台区分!

因此,我做了一些不那么理论化、更实用的东西,基于Mac的特殊性。

我将工作代码发布为答案。如果它对您也管用/可以改进,请评论。

谢谢!

回复:

这是可行的代码!

    public enum Platform
    {
        Windows,
        Linux,
        Mac
    }

    public static Platform RunningPlatform()
    {
        switch (Environment.OSVersion.Platform)
        {
            case PlatformID.Unix:
                // Well, there are chances MacOSX is reported as Unix instead of MacOSX.
                // Instead of platform check, we'll do a feature checks (Mac specific root folders)
                if (Directory.Exists("/Applications")
                    & Directory.Exists("/System")
                    & Directory.Exists("/Users")
                    & Directory.Exists("/Volumes"))
                    return Platform.Mac;
                else
                    return Platform.Linux;

            case PlatformID.MacOSX:
                return Platform.Mac;

            default:
                return Platform.Windows;
        }
    }

好的,我会在8小时后发布答案,届时我才可以这样做 :) - OlivierB
3
如果您已经有可运行的代码,请编辑您的问题并将其包含在问题中。 - Albin Sunnanbo
是的,这就是我正在做的事情 :) 为什么是-1? - OlivierB
1
我不认为这是一个完整的情况,例如,如果我的Linux已经配置了所有这些目录...那就不是不可能的... - KingCronus
如果这些目录在 Linux 安装上存在,它将被报告为 Mac,但我不得不找到解决 mono 问题的方法,因为它几乎从不报告 PlatformID.MacOSX,而是在 Linux 和 Mac 上无差别地报告 PlatformID.Unix。您认为还有更好的识别方法吗? - OlivierB
我不喜欢挖掘一个已经很久以前的问题,但是这个问题有一个相当简单的解决方案。任何基于Unix的操作系统默认都包含uname命令。如果上面的代码返回Platform.Unix,那么可以启动一个子进程运行uname -o,过滤结果是否包含linuxdarwin,然后相应地返回相应的枚举值。 - Gabi Barrientos
2个回答

9
根据Environment.OSVersion Property 页面的说明:

环境.OSVersion 属性不能提供一个可靠的方式来识别确切的操作系统及其版本。因此,我们不建议使用此方法。相反:要识别操作系统平台,请使用 RuntimeInformation.IsOSPlatform 方法。

RuntimeInformation.IsOSPlatform 对我所需的内容有效。

if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
    // Your OSX code here.
}
elseif (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
    // Your Linux code here.
}

8

1
谢谢,看起来它使用了p/invoke。它会每次都工作还是有可能出现mono抱怨的情况? - OlivierB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接