我有一个WPF应用程序正在使用Process.Start
方法启动Internet Explorer(版本9,在Win7 X64上)。
我保存ProcessID,以便在应用程序关闭时关闭它。但是,当应用程序退出时,Internet Explorer仍可在任务管理器中看到。
以下是我正在使用的代码:
public class MyClass : IDisposable
{
Process _process;
public void Go()
{
ProcessStartInfo psi = new ProcessStartInfo {
FileName = "iexplore.exe",
Arguments = "-noframemerging -private \"http://whathaveyoutried.com\""
};
_process = Process.Start(psi);
_process.WaitForInputIdle();
}
private void Close(object sender, RoutedEventArgs e)
{
if (_process != null)
{
_process.Refresh();
_process.Close();
}
}
public void Dispose()
{
if (_process != null)
{
_process.Refresh();
_process.Close();
}
}
}
}
我仔细检查过,_process.Close()
的呼叫实际上已经完成。
什么会导致这种行为?
PS:我怀疑这是由于Internet Explorer内部造成的。运行exe不需要创建新进程,但可以使用一些IPC来控制其他实例。我使用-noframemerging
命令行参数,但它不会解决问题。
[编辑] 这是另一个question I asked few days ago的延续。实际上,我正在使用Pinvoking SetParent函数在我的应用程序中嵌入生成的IE。我不能使用WebBrowser控件,因为它不支持我正在寻找的隔离。所以当我的应用程序关闭时关闭IE是可以的。
答案 0 :(得分:0)
Internet Explorer的每个标签都是一个过程。如果您使用多个选项卡打开IE或用户打开另一个选项卡,则杀死进程是不够的。
但是
_process.Close();
释放所有资源属于_process。您可以使用_process.Kill()
方法代替它。
答案 1 :(得分:0)
为了更好的安全性和稳定性,IE8使用Loosely Coupled Internet Explorer(LCIE)架构,并在不同的进程中运行浏览器框架和选项卡。 LCIE可以防止故障和挂起导致整个浏览器崩溃,从而带来更高的性能和可扩展性。我在Wikipedia上看了这个。
你可以disable LCIE,但我不确定你为什么要那样做。我会考虑使用@Damien_The_Unbeliever上面提到的解决方案。
答案 2 :(得分:0)
我的win32应用程序中有一个IE应用程序,我正在使用Win32Api
- SendMessage with WM_CLOSE = 0x0010
SendMessage(handle,0x0010,IntPtr.Zero, IntPtr.Zero)}
这将关闭IE,您需要具有浏览器的特定句柄(类IEFrame)。
有一个缺点,如果你有一个以上的标签,IE打开确认关闭对话框,阻止关闭过程。
克服对话框打开的一种方法是将复选框设置为(始终关闭),但对我来说,它不是一个选项。