如何确定System.Diagnostics.Process是32位还是64位?

问题描述:

我想:如何确定System.Diagnostics.Process是32位还是64位?

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

但它抛出一个异常的64位处理:

Win32Exception:只有进行ReadProcess OU WriteProcessMemory的请求的一部分完成

+1

你是问错了问题。真正的问题应该是:“我怎么搞砸了ReadProcessMemory调用?” – 2010-08-26 15:20:14

+1

@Hans只要问题标题得到回答,我根本不在乎这个问题。我列出的问题只是回答标题的方法。 – 2010-08-26 16:00:15

+0

[如何以编程方式知道进程是32位还是64位](http://*.com/questions/1953377/how-to-know-a-process-is-32-bit-or -64位编程) – 2010-08-26 16:15:17

,你需要通过P/Invoke来调用IsWow64Process

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

这里有一个助手,使之更容易一点致电:

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; 
} 
+1

中此方法在32位Windows中失败 – 2010-08-26 16:44:32

+1

在32位Windows上,所有进程都是32位,因此不需要执行检查。我编辑了Is64BitProcess来反映这一点。 – 2010-08-27 07:37:19

+0

使用Process.SafeHandle属性可防止GC清除进程。在WinAPI被调用时处理。 – 2016-08-01 09:38:40

无论WMI的Win32_ProcessSystem.Diagnostics.Process提供任何明确的财产。

如何通过加载的模块(Process.Modules)迭代,32位进程将装入%WinDir%\syswow64\kernel32.dll而一个64位的过程中会从%WinDir%\system32\kernel32.dll装好了(这是一个DLL,它 Windows进程加载)。

注意:当然,这个测试在x86操作系统实例上会失败。

Environment.Is64BitProcess可能是你在找什么。

+2

这只告诉你,如果调用进程是64位的,我想OP想知道另一个进程是64位的 – 2010-08-26 15:43:54

+0

@Phil:是的,我不确定OP的意图是什么。我认为他可以倒下或评论。 – 2010-08-26 15:53:27

+0

您指出的此方法不包含在.NET Fx – 2010-08-26 16:25:41