确定当前和未来 Windows 的具体版本






3.14/5 (4投票s)
2007年1月2日
2分钟阅读

34549

182
本文描述了如何确定应用程序正在运行的 Windows 特定版本,即使该版本尚未存在。
引言
虽然使用 Environment.OSVersion 确定 .NET 应用程序正在运行的 Windows 副本的版本号相对容易。但准确了解它是哪个版本的 Windows 以及它的版本(家庭版、专业版、平板电脑版、媒体中心版、N 版等)则更困难,并且不断变化的版本集意味着是否可以检测到它。
随着 Windows Vista 及其 9 个不同版本的推出,似乎能够轻松区分它们将更加困难……事实并非如此。
微软终于提供了一个简单的 API,用于确定在通用系列中运行的 Windows 版本(也称为 SKU 或产品类型),并提供了一种了解未来 Windows 版本的方法,而无需在以后更改应用程序。
我介绍 GetProductInfo
[DllImport("Kernel32.dll")]
internal static extern bool GetProductInfo(
int osMajorVersion,
int osMinorVersion,
int spMajorVersion,
int spMinorVersion,
out ProductType edition);
用法
为了确定 PC 正在运行的 Windows 版本,只需调用 GetProductInfo
并捕获该方法调用成功时最后一个参数的输出值即可。
ProductType edition = ProductType.Undefined;
if (GetProductInfo(6, 0, 0, 0, out edition))
{
Console.WriteLine("Edition: " + edition);
}
如果我们不想像仅仅是特定版本那样具体(例如,Ultimate 版或不是),我们还可以使用一个快速的 switch 块来查看该版本是否为特定类型。
switch (edition)
{
case ProductType.HomeBasic:
case ProductType.HomeBasicN:
case ProductType.HomePremium:
case ProductType.HomeServer:
//Is home edition
break;
}
未来
但这如何使您的代码能够处理未来未宣布或未知的版本?为什么我们在 API 调用中随意指定版本号?
GetProductInfo()
今天使用的 enum 与 Windows 6.0.0.0 版本(Vista)相关联,在后续版本中可能会随着新的版本号一起更新,同时仍然保留对旧版本(们)的了解。
这意味着今天针对 Vista 构建的应用程序在未来使用不同的 ProductType
值的系统上运行时,API 将识别您的应用程序仅了解 enum 中存在于 6.0.0.0 版本中的 ProductType
,并返回该类型的值,而不是返回未知值。
以上面的 switch 语句为例……如果微软将来发布 Windows 家庭版儿童版,并且该版本具有 ProductType
值为 HomeKids……您可能会收到 HomeBasic 返回,而不是返回未知值,因为您已经指定了您了解的 enum 版本。