如何正确获取系统版本号

细心的同学会发现,我们通过内置函数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;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷眼Σ(-᷅_-᷄๑)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值