How to determine whether a System.Diagnostics.Process is 32 or 64 bit?

前端 未结 3 1724
遥遥无期
遥遥无期 2021-01-05 14:46

I tried:

process.MainModule.FileName.Contains(\"x86\")

But it threw an exception for a x64 process:

Win32Exception:

相关标签:
3条回答
  • 2021-01-05 15:10

    Environment.Is64BitProcess is probably what you're looking for.

    0 讨论(0)
  • 2021-01-05 15:12

    You need to call IsWow64Process via P/Invoke:

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

    Here's a helper to make it a bit easier to call:

    public static bool Is64BitProcess( this Process process )
    {
        if ( !Environment.Is64BitOperatingSystem )
            return false;
    
        bool isWow64Process;
        if ( !IsWow64Process( process.Handle, out isWow64Process ) )
            throw new Win32Exception( Marshal.GetLastWin32Error() );
    
        return !isWow64Process;
    }
    
    0 讨论(0)
  • 2021-01-05 15:16

    Neither WMI's Win32_Process or System.Diagnostics.Process offer any explicit property.

    How about iterating through the loaded modules (Process.Modules), a 32bit process will have loaded %WinDir%\syswow64\kernel32.dll while a 64bit process will have loaded it from %WinDir%\system32\kernel32.dll (this is the one dll that every Windows process loads).

    NB. This test will, of course, fail on a x86 OS instance.

    0 讨论(0)
提交回复
热议问题