0

私のアプリケーションは、動作するためにプログラムがマシンにインストールされているかどうかを知る必要があり、Program Filesフォルダーが(32ビットマシン)のみに存在するか、Program Files(x86)フォルダー(64 )もあるかどうかを知るオプションが必要です。ビットマシン)。

私のコードを介してそれを行うための最良の方法は何ですか?

マシンに必要なアプリケーションは、32ビットと64ビットの両方にインストールできるWireshark(適切なProgram Filesフォルダー内)です。Wiresharkを使用してインストーラーファイルを作成しているため、何をすべきかわかりません。何をインストールするかを知るためのオプション。

4

5 に答える 5

3

正しいプログラムファイル(x86)パスを動的に取得するには、次を使用します。

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

32ビットシステムでは、これにより通常のProgramFilesディレクトリが返されます。64ビットシステムでは、これによりプログラムファイル(x86)ディレクトリが返されます。

あなたの特定のケースでは、私が理解しているように、64ビットのWiresharkを64ビットシステムにインストールしたいので、64ビットインストーラーがすでに利用可能でない限り、それを起動したいと思います。その場合は、プログラムファイル(x86)を完全に無視して、プログラムファイルのみをチェックすることができます。ただし、既存の32ビットWiresharkを使用できる場合は、Wiresharkをインストールできる場所を確認する必要があります。ProgramFilesをチェックインし、見つからない場合はProgramFilesX86をチェックインし、見つからない場合はインストーラーを起動します。Environment.Is64BitOperatingSystem使用するインストーラーは、 (Furqanの回答から)に基づいて決定できます。

于 2012-10-04T13:13:15.293 に答える
0

64ビットバージョンが存在する場合でも、64ビットマシンに32ビットアプリケーションをインストールすることは非常に合法であるため、両方のフォルダーを調べる必要があります。

また、ハードコードされたフォルダ名を確認せず、Environment.GetSpecialFolder代わりに使用してください。

探しているプログラムがレジストリにマークを残している場合は、代わりにそれを確認できます。ユーザーはほぼどこにでもプログラムをインストールできるため、これが最良のソリューションになります。

インストールされたWiresharkは、検索できるアンインストールレジストリエントリを書き込みます。ここを参照してください。他のすべての代わりにそれを確認してください。

于 2012-10-04T13:12:27.777 に答える
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 に答える