GetVersionEx() 已弃用:我应该使用 Environment.OSVersion 吗?

本文关键字:Environment OSVersion 我应该 GetVersionEx | 更新日期: 2023-09-27 18:32:05

我打算编写代码来确定操作系统是否是Windows XP,因此我可以设置LOCALAPPDATA环境变量来解决大量使用ExpandEnvironmentVariables()的整个代码负载。

为了使它更加有趣,有些代码是用VB6编写的,有些代码是用C# 4.0编写的。查看 GetVersionEx() 的文档,强烈建议从 Windows 8.1 开始弃用此 API 调用。但没问题,我可以使用一组不同的API调用(VerifyVersionInfo/VerSetConditionMask)。使用 VB6,别无选择 - 我必须使用 API 调用。

但是,对于我的 C# 代码,似乎没有明显的等效项。有Environment.OSVersion,但这似乎是来自不同来源的一组数据,并且没有任何VerifyVersionInfo()API的微妙之处。

此 API 调用是否有包装器。如果没有,我应该自己动心吗?

[已添加]或者,也许有人可能有一些关于 Environment.OSVersion 是如何实现的内部信息?

GetVersionEx() 已弃用:我应该使用 Environment.OSVersion 吗?

首先,了解Deprecated的含义很重要。这意味着该函数要么严重损坏(例如某些早期线程),要么已被新功能取代(替换)。在这种情况下,是后者。

在有关 GetVersionEx 函数的文档中,有一个链接建议改用版本帮助程序 API。

本页的一部分特别重要:

注意 这些 API 由 versionhelper.h 定义,它包含在 Windows 8.1 预览版软件开发工具包 (SDK)。此文件可以 与其他Microsoft Visual Studio 版本一起使用以实现 Windows 8.1 预览版之前的 Windows 版本具有相同的功能。

使用 GetVersionEx 是完全可以的。它不会从Windows中删除很长一段时间,如果有的话。Microsoft在保持与旧程序的兼容性方面有着悠久的记录。例如,您仍然可以调用 20 年前已弃用的 Win16 API。

我在最初的问题中添加了一个额外的部分,即是否有人知道 Environment.OSVersion 对象的内部结构。在这个网站上搜索了几分钟后,我发现了这个问题:

如何使用 .NET 检测 Windows 64 位平台?

现在,"官方"答案本身对我来说不是很有趣,但Phil Devaney的第二个答案提到了一个名为"Reflector"的应用程序,它似乎在做某种魔术。所以我下载了它,并把我吹了下来,我能够反编译 Environment.OSVersion 对象的构造函数的 P 代码:

Win32Native.OSVERSIONINFO osVer = new Win32Native.OSVERSIONINFO();
            if (!GetVersion(osVer))
            {
                throw new InvalidOperationException(GetResourceString("InvalidOperation_GetVersion"));
            }

就是这样:Environment.OSVersion在内部使用GetVersion,这个函数在未来的日子里可能不会运行。看起来好像VerifyVersionInfo和P/Invoke是继续前进的方式。

我现在必须在另一台计算机上下载 .NET 4.5,看看该实现是否有任何不同。

标记)也许它会对你感兴趣 GetVersionExEx但请注意,VerifyVersionInfo也可能在Windows操作系统的更高版本中被弃用(如msdn社交论坛中的技术人员所述)。

此代码依赖于 VerifyVersionInfo 并提供相同的使用体验。代码中也使用了平分算法。

版本帮助程序 API 用于对 API 的请求,此代码用于精确值。

谢谢)