细心的同学会发现,我们通过内置函数Environment.OSVersion获取到的系统版本号会存在不同的系统版本,版本号是一样的情况。代替的方案可以通过windows api 来获取内置版本号。

实现方法比较简单,就不做描述,以下是完整可用的代码。

    public class Win32
    {
        [DllImport("ntdll.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr RtlGetNtVersionNumbers(ref int dwMajor, ref int dwMinor, ref int dwBuildNumber);
    }

    public class EnvironmentEx
    {
        /// <summary>
        /// 获取系统版本号
        /// </summary>
        public static string OSVersion
        {
            get
            {
                try
                {
                    int dwMajor = 0, dwMinor = 0, dwBuildNumber = 0, buildNum = 0;

                    Win32.RtlGetNtVersionNumbers(ref dwMajor, ref dwMinor, ref dwBuildNumber);

                    if (dwBuildNumber != 0)
                    {
                        var bytes = ByteConvert.IntToBytes(dwBuildNumber);

                        buildNum = ByteConvert.BytesToInt(new byte[] { bytes[0], bytes[1], 0, 0 }, 0);
                    }

                    return $"{dwMajor}.{dwMinor}.{buildNum}";
                }
                catch (Exception)
                {
                    return Environment.OSVersion.ToString();
                }
            }
        }
    }

    public class ByteConvert
    {
        public static int BytesToInt(byte[] src, int offset)
        {
            if (src == null) return 0;
            int value;
            value = (src[offset] & 0xFF)
                    | ((src[offset + 1] & 0xFF) << 8)
                    | ((src[offset + 2] & 0xFF) << 16)
                    | ((src[offset + 3] & 0xFF) << 24);
            return value;
        }

        public static byte[] IntToBytes(int value)
        {
            byte[] src = new byte[4];
            src[3] = (byte)((value >> 24) & 0xFF);
            src[2] = (byte)((value >> 16) & 0xFF);
            src[1] = (byte)((value >> 8) & 0xFF);//高8位
            src[0] = (byte)(value & 0xFF);//低位
            return src;
        }
    }

承哥技术交流小作坊


本文会经常更新,请阅读原文: https://huchengv5.gitee.io//post/C-%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E7%89%88%E6%9C%AC%E5%8F%B7.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名胡承(包含链接: https://huchengv5.gitee.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系