细心的同学会发现,我们通过内置函数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/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。