5

我打算编写代码来确定操作系统是否是 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 是如何实现的内部信息?

4

4 回答 4

3

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

GetVersionEx 函数的文档中,有一个链接建议改用Version Helper API

此页面的一部分特别重要:

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

于 2013-09-23T08:09:08.153 回答
2

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

于 2013-09-23T07:58:55.670 回答
0

我在最初的问题中添加了一个附加部分,即是否有人知道 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 并查看该实现是否有任何不同。

于 2013-09-23T21:43:49.173 回答
0

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

该代码依赖于VerifyVersionInfo,提供相同的使用体验。代码中还使用了二分算法。

Version Helper API 用于对 API 的请求,此代码用于精确值。

谢谢)

于 2013-10-17T17:04:23.967 回答