如何确定System.Diagnostics.Process是32位还是64位?
我想:如何确定System.Diagnostics.Process是32位还是64位?
process.MainModule.FileName.Contains("x86")
但它抛出一个异常的64位处理:
Win32Exception:只有进行ReadProcess OU WriteProcessMemory的请求的一部分完成
,你需要通过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;
}
中此方法在32位Windows中失败 – 2010-08-26 16:44:32
在32位Windows上,所有进程都是32位,因此不需要执行检查。我编辑了Is64BitProcess来反映这一点。 – 2010-08-27 07:37:19
使用Process.SafeHandle属性可防止GC清除进程。在WinAPI被调用时处理。 – 2016-08-01 09:38:40
无论WMI的Win32_Process
或System.Diagnostics.Process
提供任何明确的财产。
如何通过加载的模块(Process.Modules
)迭代,32位进程将装入%WinDir%\syswow64\kernel32.dll
而一个64位的过程中会从%WinDir%\system32\kernel32.dll
装好了(这是一个DLL,它每 Windows进程加载)。
注意:当然,这个测试在x86操作系统实例上会失败。
Environment.Is64BitProcess
可能是你在找什么。
这只告诉你,如果调用进程是64位的,我想OP想知道另一个进程是64位的 – 2010-08-26 15:43:54
@Phil:是的,我不确定OP的意图是什么。我认为他可以倒下或评论。 – 2010-08-26 15:53:27
您指出的此方法不包含在.NET Fx – 2010-08-26 16:25:41
你是问错了问题。真正的问题应该是:“我怎么搞砸了ReadProcessMemory调用?” – 2010-08-26 15:20:14
@Hans只要问题标题得到回答,我根本不在乎这个问题。我列出的问题只是回答标题的方法。 – 2010-08-26 16:00:15
[如何以编程方式知道进程是32位还是64位](http://*.com/questions/1953377/how-to-know-a-process-is-32-bit-or -64位编程) – 2010-08-26 16:15:17