是否可以从CPU确定OS位?

时间:2013-11-21 14:52:38

标签: c# .net-3.5

我正在开发一个应该能够运行2个脚本中的一个的应用程序,具体取决于运行该应用程序的操作系统是x64还是x86。

周围搜索,我遇到了这个帖子:How to detect Windows 64-bit platform with .NET?

但显然我的老板担心最佳答案可能不适用于所有操作系统'我们的用户将运行(XP / Vista / 7)。他推荐了这个代码示例:

    private void GetCpuDetails(out string cpuType)
    {
        cpuType = "..."; 

        try
        {
            using (RegistryKey regKey = Registry.LocalMachine)
            {
                using (RegistryKey subRegKey = regKey.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"))
                {
                    if (subRegKey.GetValue("ProcessorNameString") != null)
                    {
                        cpuType = subRegKey.GetValue("ProcessorNameString").ToString();
                    }

                    subRegKey.Close();
                }
                regKey.Close();
            }
        }
        catch
        {
            cpuType = "...";
        }
    }

但我不明白你怎么可能从CPU确定操作系统版本。这似乎与使用PROCESSOR_ARCHITECTURE完全相同,因为它根据CPU获得64位或32位,而不是操作系统。

2 个答案:

答案 0 :(得分:5)

不,不可能仅从CPU确定这一点。 64位CPU也可以运行32位操作系统,因此了解您所拥有的CPU类型并不足以了解您拥有的操作系​​统类型。

尤其如此,因为在过去几年中几乎所有的CPU都是64位,现在这种方式已经很长时间了,因为它开始变得不寻常(并且一直在变得越来越多)找到32位电脑仍在使用中。但是,许多PC厂商仍然预装了32位Windows。我不会感到惊讶的是,对于纯粹随机的PC样本,检查CPU类型以了解操作系统目前更有可能给你错误的答案而不是正确的答案。

我见过检测操作系统类型的最佳方法是described by Raymond Chen并在此Stack Overflow问题中为C#添加了您已经看过的方法:

  

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

这是在.Net 4.0之前为.Net执行此操作的正确方法。对于4.0及更高版本,您当然可以按照评论中的提及检查System.Environment.Is64BitOperatingSystem

答案 1 :(得分:1)

为什么不检查IntPtr.Size以确定您的应用是在x64还是x86模式下运行?

如果您使用的是WoW64,它会误导您,但也许这可能对您的情况有用吗?

澄清: 以安东尼的回应为例 Load x64 or a x86 DLL depending upon the platform?

  

输入interop =(IntPtr.Size == 8)? typeof(Foo64):typeof(Foo32);

或者在May的回复中:

  

(IntPtr.Size == 4)? “x86”:“x64”

我多次使用过这种方法。