我目前正在开发一个应用程序,我在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);
}
}
}
}
关于如何使其发挥作用或更好地解决问题的任何想法?
答案 0 :(得分:2)
是。 .NET拥有并涉及IE的任何WebBrowser都是纯粹的邪恶,应该永远不会使用,因为它的行为因计算机而异。使用CefSharp(首选)或Awesomium。