在我的工具中某个时刻我想用它的名字来杀死一个进程。我现在正在测试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)上使用此工具,我需要此工具来处理这两种类型的体系结构。 怎么做到这一点?
答案 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属性不会使代码更安全,你就像杀死错误的进程一样。