关于 udione 对 WebBrowser 内存泄漏的解决方案



此代码由udione提供,用于回答有关.Net中WebBrowser控件内存泄漏的长期问题。

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

1) 第三行,

BindingOperations.ClearAllBindings(this.webbrowser); 

不会为我编译。this.webbrowser的类型是什么?我假设它是WebBrowser,但该方法需要System.Windows.DependencyObject

2) 在线

var valueSwh = field.GetValue(mainwindow);

什么是mainwindow?保存浏览器控件的窗体?

3) 在底部的第六行中,

if (object.ReferenceEquals(sinkObject.GetValue(entry), this.webbrowser.webBrowser))  

this.webbrowser.webBrowser是什么类型的?在WebBrowser类型中,我看不到名为webBrowser的字段。这只是打字错误吗?

谢谢你的帮助。

  1. BindingOperations用于WPF-如果您使用的是WinForms,则不需要此行
  2. 要获得mainwindow,只需要调用WPF方法GetWindow
 var mainwindow = GetWindow(this);

3.this.webbrowser是WPF控件(FrameworkElement.Name)的控件ID。默认情况下,这通常是webbrowser1

最新更新