1

在我的工具中,我想用它的名字杀死一个进程。我现在在 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)上使用这个工具,并且我需要这个工具来处理这两种类型的架构。如何做到这一点?

4

2 回答 2

3

失败的不是Kill() 调用,而是 process.Modules 上的 foreach。当目标进程是 64 位时,这在 32 位进程中是非常有问题的,这在 Wow64 仿真层中没有得到完美的仿真。这肯定是 Windows 源代码中某处的 //TODO 注释,它很可能无法轻易实现。

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

于 2013-06-10T13:21:34.437 回答
2

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

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

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

于 2013-06-10T13:20:43.210 回答