在Windows 8.1操作系统中,传统的GetVersionEx函数被标记为弃用,这导致开发者在获取操作系统版本信息时遇到了困难。本文将介绍如何设计并实现一个.NET环境下的操作系统版本检测工具,以解决这一问题。
GetVersionEx函数的弃用,意味着在没有正确声明支持Windows 8.1的应用程序清单文件时,Environment.OSVersion属性会返回错误的版本号6.2,而正确的值应该是6.3。为了解决这个问题,提出了一个名为OSVersionHelper的类,它提供了版本助手函数的功能,允许将运行中的操作系统版本与已知值进行比较。
GetVersionEx函数的弃用是由Windows API中的GetVersionEx函数引起的。在MSDN的文章“Windows 8.1中的操作系统版本变更”中提到,如果没有正确的应用程序清单文件,该函数将为Windows 8.1和Windows Server 2012 R2返回版本6.2。此外,GetVersionEx函数在Windows SDK 8.1中被声明为弃用。尽管如此,使用.NET的Environment.OSVersion属性并不会引起警告。
为了在.NET环境下实现版本检测,开发了一个名为OSVersionHelper的静态类,它提供了与Windows SDK 8.1中的版本助手函数相同的功能。这个类包含了自己的实现版本助手函数,并且提供了VerSetConditionMask和VerifyVersionInfo函数的PInvoke原型。
OSVersionHelper类使用.NET的PInvoke技术,调用了kernel32.dll中的VerSetConditionMask和VerifyVersionInfo函数。以下是这两个函数的C#声明:
[DllImport("kernel32.dll")]
static extern ulong VerSetConditionMask(ulong dwlConditionMask, uint dwTypeBitMask, byte dwConditionMask);
[DllImport("kernel32.dll")]
static extern bool VerifyVersionInfo(ref OsVersionInfoEx lpVersionInfo, uint dwTypeMask, ulong dwlConditionMask);
OsVersionInfoEx结构是OSVERSIONINFOEX结构的.NET包装器,它允许访问操作系统的详细信息。
实现了一个方法IsWindowsVersionOrGreater,用于比较运行中的操作系统版本是否大于或等于指定的版本。以下是该方法的实现:
static bool IsWindowsVersionOrGreater(uint majorVersion, uint minorVersion, ushort servicePackMajor)
{
OsVersionInfoEx osvi = new OsVersionInfoEx();
osvi.OSVersionInfoSize = (uint)Marshal.SizeOf(osvi);
osvi.MajorVersion = majorVersion;
osvi.MinorVersion = minorVersion;
osvi.ServicePackMajor = servicePackMajor;
const uint VER_MINORVERSION = 0x0000001;
const uint VER_MAJORVERSION = 0x0000002;
const uint VER_SERVICEPACKMAJOR = 0x0000020;
const byte VER_GREATER_EQUAL = 3;
ulong versionOrGreaterMask = VerSetConditionMask(
VerSetConditionMask(
VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL),
VER_MINORVERSION, VER_GREATER_EQUAL),
VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
uint versionOrGreaterTypeMask = VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR;
return VerifyVersionInfo(ref osvi, versionOrGreaterTypeMask, versionOrGreaterMask);
}
此外,还实现了一个属性IsWindowsServer,用于检查运行中的操作系统是否为服务器版本。
为了演示如何使用OSVersionHelper类,提供了一个完整的源代码示例,包括详细的注释和使用示例。这个示例包括调用Environment.OSVersion属性,以打印运行中的操作系统的参考版本,这需要一个应用程序清单文件。需要注意的是,OSVersionHelper类的成员即使没有应用程序清单文件,也能在Windows 8.1或Windows Server 2012 R2上正确工作。