检测CPU架构的正确方法是什么?

4
我正在尝试检测正确的CPU架构,以安装x86 MSI或x64 MSI文件。 如果我没错的话,对于MSI文件,我需要操作系统的CPU架构。 我不确定我的方法是否正确,因为我无法测试。 你认为呢?
private static string GetOSArchitecture()
    {
        string arch = System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
        string archWOW = System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432");
        if(archWOW != null && archWOW != "" && archWOW.Contains("64"))
            return "x64";
        if(arch.Contains("86"))
            return "x86";
        if (arch.Contains("64"))
            return "x64";
        return "";
    }

3
你真的打算在测试之前就发布安装程序吗?这太勇敢了。 - Hans Passant
我可以测试它,但只能在一个x64机器和一个x32机器上进行测试,而不能在每种CPU类型上进行测试...这就是问题所在。 - Kai
有关这个问题的最终解决方案吗? - Kiquenet
3个回答

3

您可以使用P/Invoke调用GetNativeSystemInfo方法,即使在64位操作系统上的32位进程中,也可以获得操作系统的CPU架构。


1
这就是它为您提供的。 - Michael
32位的Windows系统可以安装在64位的CPU上。无论是MSDN还是你的答案“实际的CPU架构”都告诉我GetNativeSystemInfo报告x64,但在这种情况下,Kai需要被告知x86。 - Windows programmer
1
再次调整答案。在运行32位操作系统的x64兼容CPU上,此函数将返回系统具有x86系统。 - Michael
接下来,您需要调整MSDN :-) - Windows programmer

0

正确的right方法是调用IsWow64Process。尽管此API“需要Windows XP SP2、Windows Vista、Windows Server 2003 SP1或Windows Server 2008”,但这种方法更加简单。


1
这并不会告诉你CPU架构是什么,只会告诉你进程本身正在以什么方式运行。 - mletterle
你需要操作系统架构还是实际的CPU架构? - Nathan Osman
我需要那种架构,以确保正确运行MSI。该代码是更新程序的一部分,用于下载MSI并执行它。 - Kai
正如你可能知道的那样,没有适用于32位和64位CPU的MSI安装程序。因此,我需要选择正确的安装程序,并在服务器上提供。 - Kai
@stuart:intptr大小的方法似乎很简单,但在WinNT上会失败。 - Kai

0

简单来说,试着运行一个64位应用程序。如果失败了,那么你就是在32位平台上。

补充一点,根据你要做什么,如果确保你的msi安装程序是一个32位应用程序,那么使用Stuart的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接