我的应用程序需要知道机器上是否安装了程序才能工作,并且我想知道Program Files 文件夹是否仅存在于(32 位机器)中或是否还有Program Files (x86)文件夹(64位机)。
通过我的代码执行此操作的最佳方法是什么?
我在机器上需要的应用程序是 Wireshark,它可以安装在 32 位和 64 位(在适当的 Program Files 文件夹中),我不知道该怎么做,因为我正在使用 Wireshark 制作安装程序文件并尝试找到最好的选择知道要安装什么。
我的应用程序需要知道机器上是否安装了程序才能工作,并且我想知道Program Files 文件夹是否仅存在于(32 位机器)中或是否还有Program Files (x86)文件夹(64位机)。
通过我的代码执行此操作的最佳方法是什么?
我在机器上需要的应用程序是 Wireshark,它可以安装在 32 位和 64 位(在适当的 Program Files 文件夹中),我不知道该怎么做,因为我正在使用 Wireshark 制作安装程序文件并尝试找到最好的选择知道要安装什么。
要动态获取正确的程序文件 (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 的回答)确定要使用的安装程序。
这样您就可以获得程序文件的路径:
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;
}
在回答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
}
}
你可以使用 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");
一旦你知道它是什么类型的系统,你可以检查特定的目录
您应该查看这两个文件夹,因为在 64 位计算机上安装 32 位应用程序是非常合法的,即使存在 64 位版本。
另外,不要检查硬编码的文件夹名称,Environment.GetSpecialFolder
而是使用。
如果您要查找的程序在注册表上留下标记,则可以改为检查。这将是最好的解决方案,因为用户几乎可以在任何地方安装程序。
安装的 Wireshark 会写入一个您可以查找的卸载注册表项。见这里。检查,而不是其他一切。