无论是32位还是64位,如何杀死进程?

在我的工具中某个时刻,我想用它的名字来杀死一个进程。 我现在正在测试Win7 64位,但我收到的错误是:

32位进程无法访问64位进程的模块

码:

Process[] runningProcesses = Process.GetProcesses(); foreach (Process process in runningProcesses) { // now check the modules of the process foreach (ProcessModule module in process.Modules) { if (module.FileName.Equals("communicator.exe")) { process.Kill(); } } } 

我将不得不在许多计算机(WinXP 32/64,Win7 32/64,Win8 64)上使用此工具,我需要此工具来处理这两种类型的体系结构。 怎么做到这一点?

使用Process.GetProcessByName() ,在大多数情况下,它与查找(main)模块的名称相同。 你仍然需要处理这个事实,这将返回多个进程。 你可能不想杀死他们所有人。 因人而异。

 foreach (Process process in Process.GetProcessByName("communicator")) { process.Kill(); } 

另请注意, Kill方法以异步方式运行,即它可能会在相应进程实际被杀死之前返回。 如果您愿意,可以添加Process.WaitForExit()

不是 Kill()调用失败,它是process.Modules上的foreach。 当目标进程为64位时,这在32位进程中非常有问题,这在Wow64仿真层中无法完美模拟。 这肯定是在Windows源代码中的某个地方// TODO评论很有可能它不容易实现。

您将不得不使用Process.Name属性。 或者将编译选项卡中项目的目标平台设置更改为AnyCPU,以便您也可以作为64位进程运行。 像你一样使用Modules属性不会使代码更安全,你就像杀死错误的进程一样。