我有以下代码:
foreach (var process in Process.GetProcessesByName(name))
{
try
{
process.Kill();
if (!process.WaitForExit(timeout))
{
session.Log("Killing process {0} timed out.", name);
}
else
{
session.Log("Killing process {0} finished successfully.", name);
}
}
catch (Exception exception)
{
session.Log("Exception while trying to kill process {0}: {1}", name, exception.ToString());
}
}
Process.Kill抛出以下异常:
Exception while trying to kill process <process name>: System.ComponentModel.Win32Exception (0x80004005): Access is denied
at System.Diagnostics.Process.Kill()
at CustomActions.CustomActions.KillAllProcesses(String name, Session session, Nullable`1 wait)
代码通常有效,但奇怪的是它失败了。它是我构建的安装程序的自定义操作的一部分,当它运行时,它在本地系统帐户下运行。我已经看到过去Process.Kill发生了这种情况。我知道there are some alternatives。我不能修改有问题的过程的代码,所以我自己终止它,但我觉得合适。如果我不关心将它留在某个中间状态,因为我正在从系统中卸载它的文件,那么最好的方法来预防需要尽快死掉的进程?如果在全局级别为应用程序设置任何设置并且用户进行升级,则应允许任何IO完成或取消。 P / Invoking TerminateProcess会成为最佳解决方案吗?