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

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

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



답변

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

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);
    }
}


답변

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

Environment.Is64BitProcess

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


답변

선택한 답변은 요청한 내용을 수행하지 않기 때문에 잘못되었습니다. 프로세스가 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);
}


답변

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

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


답변

[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;
}


답변

다음은 한 줄 확인입니다.

bool is64Bit = IntPtr.Size == 8;


답변

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

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\";