我是否需要释放从IServiceProvider检索到的SHDocVw.IWebBrowser2的接口?

时间:2012-01-20 17:13:19

标签: c# wpf com browser marshalling

我正在使用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获得的参考?

0 个答案:

没有答案