He estado investigando este tema bastante extensamente y parece que no puedo encontrar una respuesta.C# Sólo se completó una parte de una solicitud de ReadProcessMemory o WriteProcessMemory durante Process.Kill()
Sé que la excepción Only part of a ReadProcessMemory or WriteProcessMemory request was completed
se produce cuando un proceso de 32 bits intenta acceder a un proceso de 64 bits y lo mismo para un proceso de 64 bits que modifica un proceso de 32 bits.
La solución a este problema es cambiar el objetivo de la plataforma a 'Cualquier CPU'. Lo he intentado y, lamentablemente, esto no soluciona mi problema.
El siguiente bloque de código es lo que sigue arrojando la excepción. El programa que ejecuta este código se usa para abrir aplicaciones en computadoras remotas y mantiene una lista de todos los procesos que el programa mismo abrió para que no tenga que recorrer todos los procesos.
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);
}
}
Estos procesos pueden y muy probablemente serán de 32 bits y de 64 bits, mezclados.
¿Hay algo que esté haciendo que no debería estar haciendo o hay una forma mejor de hacer todo esto?
No conozco todo el programa, pero como parece que tiene los derechos para matar a distancia, ¿ha considerado utilizar PowerShell y eliminarlo remotamente? incluso puede invocar cmdlets desde C# si es necesario. http://4sysops.com/archives/query-and-kill-a-process-on-a-remote-computer-using-powershell-and-wmi/ – Vincent
@Vincent: esta es la forma en que funciona. Tengo un programa "Servidor" que ejecuto en una computadora y todas las computadoras en la misma sala son "clientes" de esta computadora servidor. Todos los clientes ejecutan un programa de cliente que acepta mensajes TCP. Para cerrar un programa, le envío al cliente un mensaje TCP para cerrar un determinado proceso y el cliente maneja la destrucción de sus propios programas. –
Puede funcionar. Sin embargo, no puedo decirlo con certeza. Pero la forma en que Windows mata los procesos puede ser diferente de C# a Wmi. – Vincent