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

问题描述 投票:0回答:2

在我在某一点的工具,我想杀死被它的名字的过程。我现在正在测试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();
        }
    }
}

我将不得不使用多台计算机这个工具(32/64的WinXP,Win7的32/64,Win8的64),我需要这个工具在两个类型的架构工作。如何实现这一目标?

c# process
2个回答
2
投票

使用Process.GetProcessesByName(),这将在大多数情况下,等同于寻找(主)模块的名称。你仍然将不得不面对这样一个事实,这将返回多个进程,所以你可能会或可能不想杀死他们,但情况因人而异。

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

还要注意的是Kill方法异步运行,即它可能会返回各自的进程实际上已经被杀害之前。如果你愿意,你可以添加一个Process.WaitForExit()


2
投票

这不是杀()调用失败,它是process.Modules在foreach。这是一个32位的过程中非常有问题的,当目标进程的64位,这没有得到在WOW64仿真层完全仿真。这肯定是一个// TODO注释与它只是不能很容易实现良好的赔率Windows源代码的地方。

你必须凑合用Process.Name财产。或在编译选项卡更改项目的目标平台设置AnyCPU,让你作为一个64位的过程中以及运行。使用模块属性像你这样不以其他方式使代码更加安全,你同样也可能杀错过程。

© www.soinside.com 2019 - 2024. All rights reserved.