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

时间:2013-06-10 13:11:45

标签: c# process

在我的工具中某个时刻我想用它的名字来杀死一个进程。我现在正在测试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)上使用此工具,我需要此工具来处理这两种类型的体系结构。 怎么做到这一点?

2 个答案:

答案 0 :(得分:2)

使用Process.GetProcessesByName(),在大多数情况下,与查找(主要)模块的名称相同。你仍然需要处理这个事实,这会返回多个进程,所以你可能想也可能不想杀掉所有进程,但是,YMMV。

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

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

答案 1 :(得分:2)

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

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