我打算编写代码来确定操作系统是否是Windows,因此我可以设置LOCALAPPDATA环境变量--围绕大量使用ExpandEnvironmentVariables()的代码。
为了使它更有趣,有些代码是用VB6编写的,有些代码是用C# 4.0编写的。查看GetVersionEx()的文档,有强烈的建议认为,从Windows8.1开始,这个API调用将被取消。但是没有问题,我可以使用一组不同的API调用(VerifyVersionInfo / VerSetConditionMask)。对于VB6,别无选择--我必须使用API调用。
然而,使用我的C#代码,似乎没有明显的等效。有Environment.OSVersion,但这似乎是来自不同来源的一组被黑客攻击的数据,而且没有任何VerifyVersionInfo() API的微妙之处。
这个API调用有包装器吗?如果没有,我是否应该亲自实现它?
添加或其他方式,也许有人可能有一些关于Environment.OSVersion是如何实现的内部信息?
发布于 2013-09-23 08:09:08
首先,理解Deprecated
的含义是很重要的。这意味着该函数要么被严重破坏(例如一些早期线程),要么已经被新功能取代(替换)。在这种情况下,是后者。
从GetVersionEx函数的文档中,有一个链接建议使用版本帮助API。
本页的一个部分特别重要:
注意,这些API是由versionhelper.h定义的,该版本包含在Windows8.1预览软件开发工具包(SDK)中。此文件可与其他Microsoft版本一起使用,以便在Windows 8.1预览之前为Windows版本实现相同的功能。
发布于 2013-09-23 07:58:55
使用GetVersionEx是非常好的。它不会在很长一段时间内从Windows中删除,如果有的话。微软在维护与旧程序的兼容性方面有着长期的记录。例如,您仍然可以调用20年前被废弃的Win16 API。
发布于 2013-09-23 21:43:49
我在最初的问题中添加了一个额外的部分,即是否有人知道Environment.OSVersion对象的内部结构。在这个网站上搜索了几分钟之后,我发现了以下问题:
现在,“官方”的答案本身对我来说并不是很有趣,但是菲尔·德瓦尼的第二个答案提到了一个叫做“反射器”的应用程序,它看起来有点神奇。因此,我下载了它,并让我崩溃了,我能够为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,看看这个实现是否有什么不同。
https://stackoverflow.com/questions/18918858
复制相似问题