0

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

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

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

4

5 回答 5

3

要动态获取正确的程序文件 (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 的回答)确定要使用的安装程序。

于 2012-10-04T13:13:15.293 回答
0

这样您就可以获得程序文件的路径:

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;

或者

使用环境变量:

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")

或者

使用 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;
}
于 2012-10-04T13:09:20.380 回答
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
    }
}
于 2012-10-04T13:21:21.493 回答
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");

一旦你知道它是什么类型的系统,你可以检查特定的目录

于 2012-10-04T13:21:42.767 回答
0

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

另外,不要检查硬编码的文件夹名称,Environment.GetSpecialFolder而是使用。

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

安装的 Wireshark 会写入一个您可以查找的卸载注册表项。见这里。检查,而不是其他一切。

于 2012-10-04T13:12:27.777 回答