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

本文关键字:无论是 何杀死 进程 | 更新日期: 2023-09-27 18:17:48

在我的工具中,在某个时候,我想用它的名字杀死一个进程。我现在正在 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(,我需要此工具在这两种类型的体系结构上工作。如何实现这一点?

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

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

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

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

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

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