如何通过代码检测我的机器是x32还是x64?

时间:2012-10-04 13:07:14

标签: c#

我的应用程序需要知道机器上是否安装了程序才能工作,我想要知道程序文件文件夹是否只存在于(32位机器)中,或者有程序文件(x86)文件夹(64位机器)。

通过我的代码执行此操作的最佳方式是什么?

我在机器上需要的应用程序是Wireshark,它可以安装在32位和64位(在相应的Program Files文件夹中),我不知道该怎么办,因为我正在使用Wireshark制作安装程序文件并尝试找到了解安装内容的最佳选择。

5 个答案:

答案 0 :(得分:3)

要动态获取正确的Program Files(x86)路径,请使用

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

在32位系统上,这将返回常规的Program Files目录。在64位系统上,这将返回Program Files(x86)目录。

在您的具体情况下,据我所知,您希望在64位系统上安装64位Wireshark,因此您需要启动64位安装程序,除非它已经可用。如果是这种情况,您可以完全忽略Program Files(x86),只检查Program Files。但是,如果您想使用现有的32位Wireshark(如果可用),则需要检查可以安装Wireshark的每个位置:检入ProgramFiles,如果找不到,请检入ProgramFilesX86,如果找不到,则启动安装程序。可以根据Environment.Is64BitOperatingSystem(来自Furqan的答案)确定要使用的安装程序。

答案 1 :(得分:0)

这样您就可以获得Program Files的路径:

string programFilePath = Environment.Is64BitOperatingSystem

   // If 64 bit locate the 32 bit folder
   ? @"C:\Program Files (x86)\"

   // Else 32 bit
   : @"C:\Program Files\";

使用System.Environment:

bool is64Bit = System.Environment.Is64BitOperatingSystem;

OR

使用环境变量:

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")

OR

使用P / Invoke:

public static ProcessorArchitecture GetProcessorArchitecture()
{
    SYSTEM_INFO si = new SYSTEM_INFO();
    GetNativeSystemInfo(ref si);
    switch (si.wProcessorArchitecture)
    {
        case PROCESSOR_ARCHITECTURE_AMD64:
            return ProcessorArchitecture.Amd64;

        case PROCESSOR_ARCHITECTURE_IA64:
            return ProcessorArchitecture.IA64;

        case PROCESSOR_ARCHITECTURE_INTEL:
            return ProcessorArchitecture.X86;

        default:
            return ProcessorArchitecture.None; // that's weird :-)
    }
}

[DllImport("kernel32.dll")]
private static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo);

private const int PROCESSOR_ARCHITECTURE_AMD64 = 9;
private const int PROCESSOR_ARCHITECTURE_IA64 = 6;
private const int PROCESSOR_ARCHITECTURE_INTEL = 0;

[StructLayout(LayoutKind.Sequential)]
private struct SYSTEM_INFO
{
    public short wProcessorArchitecture;
    public short wReserved;
    public int dwPageSize;
    public IntPtr lpMinimumApplicationAddress;
    public IntPtr lpMaximumApplicationAddress;
    public IntPtr dwActiveProcessorMask;
    public int dwNumberOfProcessors;
    public int dwProcessorType;
    public int dwAllocationGranularity;
    public short wProcessorLevel;
    public short wProcessorRevision;
}

答案 2 :(得分:0)

您应该查看这两个文件夹,因为在64位计算机上安装32位应用程序是非常合法的,即使存在64位版本。

另外,请勿检查硬编码文件夹名称,而是使用Environment.GetSpecialFolder

如果您要查找的程序在注册表上留下了标记,则可以检查该标记。这将是最好的解决方案,因为用户可以在任何地方安装程序。

安装的Wireshark写了一个你可以查找的卸载注册表项。见here。检查而不是其他所有。

答案 3 :(得分:0)

回答OP的具体问题......

if (!Directory.Exists(Environment.SpecialFolder.ProgramFilesX86.ToString())) {
    if (Directory.Exists(Environment.SpecialFolder.ProgramFiles.ToString())) {
        \\ Program Files folder exists, but Program Files (x86) does not
    } else {
        \\ Neither folder exists
    }
} else {
    if (Directory.Exists(Environment.SpecialFolder.ProgramFiles.ToString())) {
        \\ Both folders exist
    } else {
        \\ Program Files (x86) exists but Program Files does not
    }
}

答案 4 :(得分:0)

您可以使用WMI

using System.Management;

WqlObjectQuery wqlQuery =new WqlObjectQuery("select * from Win32_Processor where         DeviceID='CPU0' AND AddressWidth='64' ");
ManagementObjectSearcher searcher =new ManagementObjectSearcher(wqlQuery);

if (searcher.Get().Count > 0)
   Console.Write("64 Bit");

一旦你知道它是什么类型的系统,你可以查看具体的目录