这是确定操作系统架构的好方法吗?
Posted
技术标签:
【中文标题】这是确定操作系统架构的好方法吗?【英文标题】:Is this a good way to determine OS Architecture? 【发布时间】:2010-09-05 10:58:33 【问题描述】:由于Windows Vista中WMI类Win32_OperatingSystem只包含OSArchitecture,所以我很快写了一个方法,使用注册表来判断当前系统是32位还是64位系统。
private Boolean is64BitOperatingSystem()
RegistryKey localEnvironment = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment");
String processorArchitecture = (String) localEnvironment.GetValue("PROCESSOR_ARCHITECTURE");
if (processorArchitecture.Equals("x86"))
return false;
else
return true;
到目前为止,这对我们来说效果很好,但我不确定我是否喜欢浏览注册表。这是一种非常标准的做法还是有更好的方法?
编辑:哇,预览中的代码看起来更漂亮了。下次我会考虑链接到 pastebin 或其他东西。
【问题讨论】:
【参考方案1】:看看 Raymond Chens 的解决方案:
How to detect programmatically whether you are running on 64-bit Windows
这是 .NET 的 PINVOKE:
IsWow64Process (kernel32)
更新:我会在检查“x86”时遇到问题。谁能说英特尔或 AMD 的下一个 32 位处理器可能被指定为什么。概率很低,但有风险。您应该要求操作系统通过正确的 API 来确定这一点,而不是通过查询可能被认为对外界不透明的操作系统版本/平台特定值。问自己这些问题,1 - 相关的注册表项是否由 MS 正确记录,2 - 如果是,它们是否提供了可能值的明确列表,保证允许您作为开发人员在您是否正在运行之间做出明智的决定32 位或 64 位。如果答案是否定的,那么调用 API,是的,它是一个更冗长的但它被记录和确定。
【讨论】:
【参考方案2】:在 .NET 下测试 64 位的最简单方法是检查 IntPtr.Size 的值。
对于在 WOW 下运行的 32 位应用程序,我认为 IntPtr.Size 的值是 4,不是吗?
编辑:@Edit:是的。 :)
【讨论】:
【参考方案3】:在 .NET 下测试 64 位的最简单方法是检查 IntPtr.Size 的值。
编辑:Doh!这将告诉您当前进程是否为 64 位,而不是整个操作系统。对不起!
【讨论】:
【参考方案4】:查看注册表是完全有效的,只要您可以确定应用程序的用户将始终可以访问您需要的内容。
【讨论】:
以上是关于这是确定操作系统架构的好方法吗?的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-98]:《软件架构设计:程序员向架构师转型必备》-8-确定关键性需求与决定系统架构的因素