不推荐使用GetVersionEx():我应该使用Environment.OSVersion吗?

时间:2013-09-20 14:10:52

标签: c# .net winapi

我打算编写代码来确定操作系统是否是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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

GetVersionEx function上的文档中,有一个建议使用Version Helper APIs的链接。

本页的一部分特别重要:

  

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

答案 2 :(得分:0)

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

How to detect Windows 64-bit platform with .NET?

现在,“官方”答案本身对我来说并不是很有趣,但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,看看该实现是否有所不同。

答案 3 :(得分:0)

标记) 也许对你来说很有意思GetVersionExEx 但请注意,在Windows OS的更高版本中也可能不推荐使用VerifyVersionInfo(如msdn社交论坛中的ms tech guy所述)。

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

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

感谢)