특정 프로세스가 32 비트인지 64 비트인지 프로그래밍 방식으로 확인하는 방법


102

내 C # 애플리케이션은 특정 애플리케이션 / 프로세스 (참고 : 현재 프로세스가 아님)가 32 비트 또는 64 비트 모드에서 실행 중인지 어떻게 확인할 수 있습니까?

예를 들어, 이름 (예 : 'abc.exe') 또는 프로세스 ID 번호를 기반으로 특정 프로세스를 쿼리 할 수 ​​있습니다.


항상 언어를 태그로 입력하십시오. 이제이 게시물에서 변경하겠습니다. :-)
Dean J

3
현재 프로세스가 64 비트 인지 알고 싶은지 아니면 다른 프로세스를 쿼리 하고 있는지 명확히하십시오 .
Mehrdad Afshari

답변:


177

내가 본 더 흥미로운 방법 중 하나는 다음과 같습니다.

if (IntPtr.Size == 4)
{
    // 32-bit
}
else if (IntPtr.Size == 8)
{
    // 64-bit
}
else
{
    // The future is now!
}

64 비트 에뮬레이터 (WOW64)에서 다른 프로세스가 실행 중인지 확인하려면 다음 코드를 사용하세요.

namespace Is64Bit
{
    using System;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Runtime.InteropServices;

    internal static class Program
    {
        private static void Main()
        {
            foreach (var p in Process.GetProcesses())
            {
                try
                {
                    Console.WriteLine(p.ProcessName + " is " + (p.IsWin64Emulator() ? string.Empty : "not ") + "32-bit");
                }
                catch (Win32Exception ex)
                {
                    if (ex.NativeErrorCode != 0x00000005)
                    {
                        throw;
                    }
                }
            }

            Console.ReadLine();
        }

        private static bool IsWin64Emulator(this Process process)
        {
            if ((Environment.OSVersion.Version.Major > 5)
                || ((Environment.OSVersion.Version.Major == 5) && (Environment.OSVersion.Version.Minor >= 1)))
            {
                bool retVal;

                return NativeMethods.IsWow64Process(process.Handle, out retVal) && retVal;
            }

            return false; // not on 64-bit Windows Emulator
        }
    }

    internal static class NativeMethods
    {
        [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool IsWow64Process([In] IntPtr process, [Out] out bool wow64Process);
    }
}

8
(Environment.OSVersion.Version.Major >= 5 && Environment.OSVersion.Version.Minor >= 1) 이것이 바로 Microsoft가 이와 같은 코드의 버그를 해결하기 위해 버전 거짓말 호환성 심을 만들어야하는 이유입니다. Windows Vista (6.0)가 나오면 어떻게됩니까? 그리고 사람들은 Microsoft가 7.0이 아닌 Windows 7 버전 6.1을 만드는 것에 대해 입을 다물고 많은 앱 호환성 버그를 수정합니다.
Ian Boyd

4
함수 이름 IsWin64는 약간 오해의 소지가 있다고 생각합니다. 32 비트 프로세스가 x64 OS에서 실행 중이면 true를 반환합니다.
Denis The Menace 2013

2
processHandle = Process.GetProcessById(process.Id).Handle;대신 사용 processHandle = process.Handle;합니까?
Jonathon Reinhart

1
@JonathonReinhart는 좋은 질문이 아닙니다. 나는 모른다. 한 가지 방식으로 일을 전환하는 것에서 흔적이 남았을 것입니다. 찾아 주셔서 감사합니다!
Jesse C. Slicer

1
이 대답은 틀 렸습니다. 오류가 발생한 경우 예외를 발생시키는 대신 false를 반환하는 것은 매우 나쁜 설계입니다.
user626528

141

.Net 4.0을 사용하는 경우 현재 프로세스에 대해 한 줄짜리입니다.

Environment.Is64BitProcess

Environment.Is64BitProcessProperty (MSDN)를 참조하십시오 .


2
코드를 게시 할 수 Is64BitProcess있습니까? 아마도 내가 64 비트 프로세스로 실행 중인지 알아 내기 위해 그것이하는 일을 사용할 수있을 것입니다.
Ian Boyd

1
@Ian, Sam이이 포럼에 MS 코드를 게시하는 것이 합법적으로 허용 될 것 같지 않습니다. 참조 라이센스의 정확한 내용은 확실하지 않지만 어디서나 코드 복제를 금지한다고 확신합니다.
ProfK 2011 년

3
@Ian 누군가가 당신을 위해 그 일을하고있다 : stackoverflow.com/questions/336633/...
로버트 맥클레인

4
OP는 구체적으로 현재 프로세스가 아닌 다른 프로세스 를 쿼리하도록 요청했습니다 .
Harry Johnston

1
Microsoft Is64BitProcess ( referencesource.microsoft.com/#mscorlib/system/environment.cs )에 대한 코드를 게시했습니다 . 그러나 이는 컴파일 기호로 제어되는 하드 코딩 된 return 문입니다.
Brian

20

선택한 답변은 요청한 내용을 수행하지 않기 때문에 잘못되었습니다. 프로세스가 x64 OS에서 실행되는 x86 프로세스인지 확인합니다. 따라서 x64 OS의 x64 프로세스 또는 x86 OS에서 실행되는 x86 프로세스에 대해 "false"를 반환합니다.
또한 오류를 올바르게 처리하지 않습니다.

더 정확한 방법은 다음과 같습니다.

internal static class NativeMethods
{
    // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=vs.85%29.aspx
    public static bool Is64Bit(Process process)
    {
        if (!Environment.Is64BitOperatingSystem)
            return false;
        // if this method is not available in your version of .NET, use GetNativeSystemInfo via P/Invoke instead

        bool isWow64;
        if (!IsWow64Process(process.Handle, out isWow64))
            throw new Win32Exception();
        return !isWow64;
    }

    [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool IsWow64Process([In] IntPtr process, [Out] out bool wow64Process);
}

1
Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "x86"32 비트 프로세스의 경우 항상 true를 반환합니다. 더 나은 사용에 System.Environment.Is64BitOperatingSystem.NET4이 지원되는 경우
Aizzat Suhardi

10

포인터의 크기를 확인하여 32 비트인지 64 비트인지 확인할 수 있습니다.

int bits = IntPtr.Size * 8;
Console.WriteLine( "{0}-bit", bits );
Console.ReadLine();

6
이 답변이 처음 게시되었을 당시에는 명확하지 않았지만 OP는 현재 프로세스가 아닌 다른 프로세스 를 쿼리하는 방법을 알고 싶었습니다 .
Harry Johnston

3
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo);

public static bool Is64Bit()
{
    bool retVal;

    IsWow64Process(Process.GetCurrentProcess().Handle, out retVal);

    return retVal;
}

5
OP는 구체적으로 현재 프로세스가 아닌 다른 프로세스 를 쿼리하는 방법을 물었습니다 .
Harry Johnston

1

다음은 한 줄 확인입니다.

bool is64Bit = IntPtr.Size == 8;

6
OP는 구체적으로 현재 프로세스가 아닌 다른 프로세스 를 쿼리하는 방법을 물었습니다 .
Harry Johnston

0

나는 이것을 사용하고 싶다 :

string e = Environment.Is64BitOperatingSystem

이렇게하면 쉽게 작성할 수있는 파일을 찾거나 확인할 수 있습니다.

string e = Environment.Is64BitOperatingSystem

       // If 64 bit locate the 32 bit folder
       ? @"C:\Program Files (x86)\"

       // Else 32 bit
       : @"C:\Program Files\";

13
64 비트 OS 머신에서 32 비트 프로세스는 어떻습니까?
Kiquenet

3
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)`C : \ Program Files`를 하드 코딩 하는 대신 사용하기가 정말 어렵 습니까?
Luaan

2
지역화 할 수있는 문자열이기 때문에 "프로그램 파일"을 하드 코딩하지 마십시오. 등 Αρχεία Εφαρμογών, Arquivos 드 Programas,
stevieg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.