Ho svolto ricerche approfondite su questo problema e non riesco a trovare una risposta.C# È stata completata solo una parte di una richiesta ReadProcessMemory o WriteProcessMemory durante Process.Kill()
So che l'eccezione Only part of a ReadProcessMemory or WriteProcessMemory request was completed
viene generata quando un processo a 32 bit tenta di accedere a un processo a 64 bit e lo stesso per un 64 bit che modifica un processo a 32 bit.
La soluzione a tale problema è di modificare il Target piattaforma su "Qualsiasi CPU". Ho provato questo e sfortunatamente questo non risolve il mio problema.
Il prossimo blocco di codice è ciò che continua a generare un'eccezione. Il programma che esegue questo codice viene utilizzato per aprire le applicazioni sui computer remoti e mantiene un elenco di tutti i processi aperti dal programma in modo che non debba scorrere tutti i processi.
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);
}
}
Questi processi possono e molto probabilmente sarà a 32-bit e 64-bit, mescolati insieme.
C'è qualcosa che sto facendo che non dovrei fare, o c'è solo un modo migliore per fare tutto questo?
Non conosco l'intero programma ma poiché sembra che tu abbia i diritti per l'eliminazione remota, hai considerato l'utilizzo di PowerShell e l'eliminazione remota? se necessario, puoi anche chiamare i cmdlet da C#. http://4sysops.com/archives/query-and-kill-a-process-on-a-remote-computer-using-powershell-and-wmi/ – Vincent
@Vincent: questo è il modo in cui funziona. Ho un programma "Server" che eseguo su un computer e tutti i computer nella stessa stanza sono "client" di questo computer server. Tutti i client eseguono un programma client che accetta i messaggi TCP. Per chiudere un programma, invio al client un messaggio TCP per chiudere un determinato processo e il client gestisce l'uccisione dei propri programmi. –
Potrebbe funzionare. Non posso dire per certo però. Ma il modo in cui Windows uccide i processi potrebbe essere diverso da C# a Wmi. – Vincent