C#在Process.Kill()期间只完成了ReadProcessMemory或WriteProcessMemory请求的一部分

Kyl*_*ven 16 c# exception process

我一直在广泛研究这个问题,似乎无法找到答案.

我知道Only part of a ReadProcessMemory or WriteProcessMemory request was completed当32位进程尝试访问64位进程时会抛出异常,而对于64位进程修改32位进程则会抛出异常.

该问题的解决方案是将平台目标更改为"任何CPU".我试过这个,不幸的是这并没有解决我的问题.

下一个代码块是不断抛出异常的原因.运行此代码的程序用于在远程计算机上打开应用程序,并保留程序本身打开的所有进程的列表,这样我就不必遍历所有进程.

Process processToRemove = null;
lock (_runningProcesses)
{
    foreach (Process p in _runningProcesses)
    {
        foreach (ProcessModule module in p.Modules)
        {
            string[] strs = text.Split('\\');

            if (module.ModuleName.Equals(strs[strs.Length - 1]))
            {
                processToRemove = p;
                break;
            }
        }
        if (processToRemove != null)
        {
            break;
        }
    }
    if (processToRemove != null)
    {
        processToRemove.Kill();
        _runningProcesses.Remove(processToRemove);
    }
}
Run Code Online (Sandbox Code Playgroud)

这些过程可以并且很可能是32位和64位混合在一起.

我有什么我不应该做的事情,或者是否有更好的方法来做所有这些?

min*_*ill 16

正如Process.Modules此线程的MSDN页面的注释中所详述的那样,在Process.Modules从64位进程枚举32位进程时存在一个已知问题,反之亦然:

.NET内部的Process.Modules使用PSAPI.dll中的EnumProcessModules函数.此函数有一个已知问题,它无法跨32/64位进程边界工作.因此,从32位进程枚举另一个64位进程(反之亦然)无法正常工作.

解决方案似乎是使用该EnumProcessModulesEx函数(必须通过P/Invoke调用),但此功能仅适用于Windows的更高版本.

我们通过向PSAPI.dll(http://msdn2.microsoft.com/en-us/library/ms682633.aspx)添加一个名为EnumProcessModulesEx的新函数来修复此问题,但我们目前无法在这种情况下使用它:

  • 它仅适用于Windows Vista或Windows Server 2008
  • 目前.NET 2.0 Framework没有Service Pack或修补程序来使Process.Modules使用这个新API