大家好。
我遇到了一个奇怪的问题。我的应用程序有一个简单的方法,如果IE进入状态,它会无法响应此方法被解雇所有IE进程,然后应用程序重新启动它与IE的工作。
方法代码:
foreach (System.Diagnostics.Process exe in System.Diagnostics.Process.GetProcesses())
{
if (exe.ProcessName.StartsWith("iexplore"))
exe.Kill();
}
即使使用管理员权限调试我的应用程序,应用程序有时也会成功运行此方法,有时我甚至以管理员身份运行错误Access Denied
。
我甚至编写了我自己的清单文件,指明需要使用管理员权限执行此应用程序,我认为我做对了。
清单代码:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="Demo.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
</application>
</compatibility>
</asmv1:assembly>
之前有人遇到过同样的问题吗?我怎样才能纠正这个奇怪的问题。
由于
答案 0 :(得分:9)
鉴于您说当您尝试调用此方法时始终拥有管理权限,以下内容将解释您出现间歇性问题的原因:
System.Diagnostics.Process.Kill:
如果在进程当前正在终止时调用
Kill
方法,则会拒绝访问拒绝Win32Exception
。
如果您快速点击'删除'+'确定'两次,在Process-Explorer中的条目上,您就会知道我在说什么。
答案 1 :(得分:5)
您是否将代码包装在try / catch块中以查看是否抛出了异常?如果没有,请尝试
try
{
foreach (System.Diagnostics.Process exe in System.Diagnostics.Process.GetProcesses())
{
if (exe.ProcessName.StartsWith("iexplore"))
exe.Kill();
}
}
catch (Win32Exception e)
{
Console.WriteLine("The process is terminating or could not be terminated.");
}
catch (InvalidOperationException e)
{
Console.Writeline("The process has already exited.");
}
catch (Exception e) // some other exception
{
Console.WriteLine("{0} Exception caught.", e);
}
答案 2 :(得分:1)
这是Internet Explorer的一个怪癖,它为一个会话启动多个进程。杀死其中一个会导致所有人退出。您可能会看到“进程已退出”异常。这样做是这样的:
foreach (var ie in Process.GetProcessesByName("iexplore")) {
try {
ie.Kill();
}
catch {}
}
答案 3 :(得分:0)
你不应该使用“foreach”杀死它,并且在两次杀戮之间,你需要延迟完全杀死进程