Windows 64 비트에서 프로그램 파일 (x86)을 얻는 방법


153

나는 사용하고있다 :

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

프로그램이 사용자 컴퓨터에서 감지되는지 확인하기 위해 (이상적이지는 않지만 내가 찾고있는 프로그램은 MS-DOS 응용 프로그램의 오래된 구식이며 다른 방법을 생각할 수 없었습니다).

Windows XP 및 32 비트 버전의 Windows Vista에서는 올바르게 작동합니다. 그러나 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는이 세 가지 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
현지화 된 환경에서 이것이 작동하는지에 대해 의견을 말할 수 있습니까? 미리 감사드립니다 ...
Tom

이 테스트가 필요한 이유 : 8 == IntPtr.Size?
Florian

1
@Florian 64 비트 프로세스를 점검하는 테스트입니다
JaredPar

10
왜 그냥 Environment.Is64BitOperatingSystemEnvironment.Is64BitProcess?
osvein

7
@anustart 이것은 .NET 4.0에서 이러한 방법을 사용할 수 있기 전에 2008 년에 답변되었습니다.
Rotem

135

.NET 4를 사용하는 경우 특별한 폴더 열거 형 ProgramFilesX86이 있습니다 .

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

2
이것이 32 비트 OS에서 어떻게 작동합니까? x86없이 "c : \ Program files"를 반환합니까?
Marcel Gosselin

6
예. x86에서는 c : \ program 파일을, 64 비트 윈도우에서는 c : \ program 파일 (x86)을 반환합니다.
Nathan

2
직접 테스트 해보십시오. Server 2003 32 비트에서는 빈 문자열이 반환됩니다. Console.WriteLine ( "X86 :"+ System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
David Eison

4
또한 윈도우 XP (32 비트)에 빈 문자열을 반환
패트릭 맥도날드

12
"x86 시스템에서 ProgramFilesX86 멤버를 Environment.GetFolderPath 메서드에 전달하면 String.Empty가 반환되고 대신 ProgramFiles 멤버를 사용하십시오. Environment.Is64BitOperatingSystem 속성을 호출하여 Windows가 32 비트 운영 체제인지 확인할 수 있습니다. "
goodies4uall

42
Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)

14

그러나 ProgramFiles(x86)환경 변수는 응용 프로그램이 64 비트를 실행중인 경우에만 사용할 수 있습니다.

응용 프로그램이 32 비트를 실행중인 경우 ProgramFiles실제로 "Program Files (x86)"값을 갖는 환경 변수를 사용할 수 있습니다 .


충분합니다. 그러나 그의 응용 프로그램 32 비트로 실행되고 있음을 알 수 있습니다. 그렇지 않으면 GetFolderPath ()가 이미 올바른 x86 폴더를 반환합니다.
tomasr

매우 도움이되었습니다! 이것은 단지 작업 시간을 절약했습니다! 사람들이 내 코드를 사용하지 않아도됩니다. 물건이 상자 밖으로 나올 때 좋습니다!
David Silva Smith

9

한 가지 방법은 "ProgramFiles (x86)"환경 변수를 찾는 것입니다.

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

5

Windows 7 용 x86 및 x64 플랫폼 모두에서 실행할 수있는 응용 프로그램을 작성 중이며 아래 변수를 쿼리하면 모든 플랫폼에서 올바른 프로그램 파일 폴더 경로를 가져옵니다.

Environment.GetEnvironmentVariable("PROGRAMFILES")

실제로 이것은 허용되는 답변으로 표시되어야합니다. 이것은 로직 테스트를 수행하는 것보다 훨씬 낫습니다. 그러나 앱의 컴파일 된 비트 유형에 적합한 폴더를 반환합니다. 즉, 앱을 32 비트로 컴파일하면 32 비트 OS에서 "프로그램 파일"및 64 비트 OS에서 "프로그램 파일 (x86)"을 반환합니다. 완전한!
DiscipleMichael

주의 : 문제는 "실행중인 응용 프로그램의 올바른 프로그램 파일 폴더를 얻는 방법"이 아니라 "Windows 64 비트에서 프로그램 파일 (x86)을 얻는 방법"입니다. 따라서 기능 측면에서이 답변은 질문에 대한 적절한 답변이 아닙니다.
tedebus

0

.NET의 새로운 방법을 사용하는 원 라이너. 항상 x86 프로그램 파일 폴더를 반환합니다.

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 비트 프로세스에서 32 비트 코드로 JIT

64 비트 프로세스에서 32 비트 코드로 JIT

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.