我打算编写代码来确定操作系统是否是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的内部信息?
答案 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的请求,此代码用于确切的值。
感谢)