我正在使用WPF WebBrowser(System.Windows.Controls.WebBrowser)并使用IServiceProvider获取对IWebBrowser2接口的引用。
Guid serviceGuid = SID_SWebBrowserApp;
Guid iid = typeof(SHDocVw.IWebBrowser2).GUID;
IWebBrowser2 = (SHDocVw.IWebBrowser2)serviceProvider.QueryService(ref serviceGuid, ref iid);
IServiceProvider定义如下:
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
internal interface IServiceProvider
{
[return: MarshalAs(UnmanagedType.IUnknown)]
object QueryService(ref Guid guidService, ref Guid riid);
}
我已将WebBrowser嵌入到某种“IE Light”体验中。它是一个包含标准Web导航栏(后退,前进,停止/重新加载和URL条目)和WebBrowser控件的视图。
我的程序可能会定期显示和隐藏此控件作为MVVM Light项目的一部分。
MVVM Light使用“清理”操作。据我了解,它很像dispose,但意味着在不立即需要控件的情况下运行。稍后可以重新控制该控件,因此可以多次调用Cleanup。我把它当作对Dispose的调用,这意味着我不希望任何未使用的资源(托管或非托管)占用内存。
我期待在应用程序的生命周期内对窗口进行多次实例化。因此,我不希望多次调用Cleanup来保留挂起的COM引用。
如果我通过查询接口无意中添加了一个COM引用,我不希望它有一个挂起的COM引用。我完成后应该拨打Marshal.ReleaseCOMObject
吗?或者我是否过度偏执,因为我需要清理从IServiceProvider
获得的参考?