WPF内存泄漏中的WinForms WebBrowser

时间:2013-05-16 23:03:08

标签: .net wpf winforms memory-leaks browser

我目前正在开发一个应用程序,我在WinForms主机中使用WinForms WebBrowser控件。问题是即使我关闭浏览器并处理内存似乎没有释放的所有内容。

我找到了这篇文章,看起来udione的答案可能正是我正在寻找的。问题是我不知道如何通过WPF使用WinForms控件。

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

这也是我改变了它但似乎没有做到这一点。我不确定this.webbrowser.webBrowser

    public void DisposeWebBrowser(System.Windows.Forms.WebBrowser browser)
    {
        //dispose to clear most of the references
        browser.Dispose();

        //REMOVED THIS LINE
        //BindingOperations.ClearAllBindings(browser.);

        //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);

        //CHANGED THIS LINE
        //var valueSwh = field.GetValue(mainwindow);   <-- OLD LINE
        var valueSwh = field.GetValue(GetWindow(this));

        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);

                //CHANGED THIS LINE
                //if (object.ReferenceEquals(sinkObject.GetValue(entry), this.webbrowser.webBrowser)) <-- OLD LINE
                if (object.ReferenceEquals(sinkObject.GetValue(entry), browser))
                {
                    ilist.Remove(entry);
                }
            }
        } 
    }

关于如何使其发挥作用或更好地解决问题的任何想法?

1 个答案:

答案 0 :(得分:2)

是。 .NET拥有并涉及IE的任何WebBrowser都是纯粹的邪恶,应该永远不会使用,因为它的行为因计算机而异。使用CefSharp(首选)或Awesomium。