WebBrowser控制内存泄漏

时间:2013-12-11 18:21:10

标签: c# internet-explorer memory-leaks browser

我在webBrowser控件中遇到内存泄漏问题。 我找到了这个帖子:

How to get around the memory leak in the .NET Webbrowser control?

和此:

//dispose to clear most of the references
this.webbrowser.Dispose();
BindingOperations.ClearAllBindings(this.webbrowser);

//using reflection to remove one reference that was not removed with the dispose 
var field = typeof(System.Windows.Window).GetField("_swh", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

var valueSwh = field.GetValue(mainwindow);

var valueSourceWindow = valueSwh.GetType().GetField("_sourceWindow", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(valueSwh);

var valuekeyboardInput = valueSourceWindow.GetType().GetField("_keyboardInputSinkChildren", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(valueSourceWindow);

System.Collections.IList ilist = valuekeyboardInput as System.Collections.IList;

lock(ilist)
{
    for (int i = ilist.Count-1; i >= 0; i--)
    {
        var entry = ilist[i];
        var sinkObject = entry.GetType().GetField("_sink", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        if (object.ReferenceEquals(sinkObject.GetValue(entry), this.webbrowser.webBrowser))
        {
            ilist.Remove(entry);
        }
    }
} 

但是我使用Windows.Forms没有WPF窗口,我将转换此代码的问题转化为我的需求。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:3)

我们在几个应用程序中使用了Chromium。这使我们能够在WinXP中运行HTML 5。由于webBrowser控件使用已安装的操作系统IE,因此无法使用大多数更好的HTML / Javascript。 Microsoft不支持WinXP的IE,因此应用程序只能访问旧版本的IE。

如果您使用Chromium的CEFSharp版本,您甚至可以编译其他mod并帮助您进行导航,从而为您提供IE不支持的改进嵌入式通信。

代码非常简单,有几个例子,但只看:

InitializeComponent();
Text = "CefSharp";

web_view = new WebView("https://github.com/perlun/CefSharp", new BrowserSettings());
web_view.Dock = DockStyle.Fill;
toolStripContainer.ContentPanel.Controls.Add(web_view);
//even setup the console to log to a Textbox for debugging by setting up a Handler.
web_view.ConsoleMessage += new CefSharp.ConsoleMessageEventHandler(ConsoleMessageHandler);

答案 1 :(得分:2)

我们前一段时间遇到过这个问题......无济于事。

要解决问题并将应用程序的内存消耗保持在合理的水平,我们决定将应用程序拆分为两种进程,一种用于主窗口,另一种用于托管WebBrowserControl。然后,设计一个管道协议(或类似RMI / RPC)来将事件从主窗口传递到子进程,反之亦然。

这样做,您可以使用浏览器进程池和后台kill-and-spawn策略设计循环策略,以使内存消耗处于受控级别。

答案 2 :(得分:1)

您是否考虑过使用其他网络浏览器控件?那里有很多东西!我觉得chromium是一个不错的选择,请查看this question以寻找替代方案。