C#-Windows 64ビットでプログラムファイル(x86)を取得する方法


153

私が使用しています:

FileInfo(
    System.Environment.GetFolderPath(
        System.Environment.SpecialFolder.ProgramFiles) 
    + @"\MyInstalledApp"

ユーザーのマシンでプログラムが検出されたかどうかを判断するために(理想的ではありませんが、私が探しているプログラムはMS-DOSアプリケーションの古き良きものであり、他の方法は考えられませんでした)。

Windows XPおよびWindows Vistaの32ビットバージョンでは、これは正常に機能します。ただし、x64 Windows Vistaでは、コードはx64 Program Filesフォルダーを返しますが、アプリケーションはProgram Files x86にインストールされます。"C:\ Program Files(x86)"を配線せずにProgram Files x86へのパスをプログラムで返す方法はありますか?


9
64ビットOSの64ビットアプリケーションでのみ「プログラムファイル」が返されることは注目に値します。特にx86としてアプリケーションをコンパイルすると、このコードを使用して64ビットOSで「プログラムファイル(x86)」が返されます。
-VitalyB

回答:


230

以下の関数Program Filesは、これら3つのWindows構成すべてでx86 ディレクトリを返します。

  • 32ビットWindows
  • 64ビットWindowsで実行される32ビットプログラム
  • 64ビットウィンドウで実行される64ビットプログラム

 

static string ProgramFilesx86()
{
    if( 8 == IntPtr.Size 
        || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
    {
        return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
    }

    return Environment.GetEnvironmentVariable("ProgramFiles");
}

1
これがローカライズされた環境で機能するかどうかについて誰かがコメントできますか?よろしくお願いします...
トム

なぜこのテスト:8 == IntPtr.Size?
フロリアン

1
@Florian 64ビットプロセスをチェックするテストです
JaredPar

10
なぜだけではなく、Environment.Is64BitOperatingSystemEnvironment.Is64BitProcess
osvein 2013

7
@anustartこれらのメソッドが.NET 4.0で利用可能になる前の2008年に回答されました。
Rotem 14

135

.NET 4を使用している場合は、特別なフォルダー列挙ProgramFilesX86があります。

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

2
これは32ビットOSでどのように動作しますか?x86なしで「c:\ Program files」を返しますか?
Marcel Gosselin、2011

6
はい。x86ではc:\ programファイル、64ビットウィンドウではc:\ programファイル(x86)を返します。
ネイサン

2
自分でテストします-Server 2003 32ビットでは、これは空の文字列を返します:Console.WriteLine( "X86:" + System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86));
David Eison

4
また、Windows XP(32ビット)では空の文字列を返します
Patrick McDonald

12
Microsoftのドキュメントでは、「x86システムでは、ProgramFilesX86メンバーをEnvironment.GetFolderPathメソッドに渡すとString.Emptyが返されます。代わりにProgramFilesメンバーを使用してください。Windowsが32ビットオペレーティングシステムかどうかは、Environment.Is64BitOperatingSystemプロパティを呼び出すことで確認できます。 」
goodies4uall 2013年


14

ただし、ProgramFiles(x86)環境変数は、アプリケーションが64ビットを実行している場合にのみ使用できることに注意してください。

アプリケーションが32ビットを実行してProgramFilesいる場合、値が実際には「Program Files(x86)」になる環境変数を使用できます。


十分だ。しかし、彼のアプリケーションが 32ビットとして実行されです。それ以外の場合、GetFolderPath()はすでに正しいx86フォルダーを返しています。
tomasr 2008年

非常に役立ちます!これにより、作業時間を節約できました。そして、私のコードを使用する必要から人々を救った。箱から出してすぐに機能するのは素晴らしいことです!
David Silva Smith、

9

1つの方法は、 "ProgramFiles(x86)"環境変数を探すことです。

String x86folder = Environment.GetEnvironmentVariable("ProgramFiles(x86)");

5

私はWindows 7のx86とx64の両方のプラットフォームで実行できるアプリケーションを作成しています。以下の変数を照会すると、どのプラットフォームでも適切なプログラムファイルフォルダーパスが取得されます。

Environment.GetEnvironmentVariable("PROGRAMFILES")

本当に、これも許容できる回答としてマークする必要があります。これは、論理テストを実行するよりもはるかに優れています。ただし、アプリのコンパイル済みビットタイプに適したフォルダーを返します。つまり、アプリを32ビットでコンパイルした場合、32ビットOSでは「Program Files」、64ビットOSでは「Program Files(x86)」が返されます。パーフェクト!
弟子

注意:「Windows 64ビットでProgram Files(x86)を取得する方法」ではなく、「実行中のアプリケーションの適切なProgram Fileフォルダーを取得する方法」ではありません。したがって、この回答は、機能の点では正しいので、質問に対する適切な回答ではありません。
テデバス2017年

0

.NETの新しいメソッドを使用したワンライナー。常にx86 Program Filesフォルダーを返します。

Environment.Is64BitOperatingSystem ? Environment.GetEnvironmentVariable("ProgramFiles(x86)") : Environment.GetEnvironmentVariable("ProgramFiles"))


0

C#コード:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

出力:

C:\ Program Files(x86)

注意:

特定のビルドプラットフォームを優先しないようにコンパイラーに指示する必要があります。

Go to Visual Studio > Project Properties > Build > Uncheck "Prefer 32 bit"

理由:

ほとんどの.NETプロジェクトのデフォルトは「任意のCPU 32ビット優先」です。

チェックを外すと、32ビットアセンブリは次のようになります。

32ビットプロセスでのJITから32ビットコードへ

64ビットプロセスでのJITから32ビットコード

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.