4

在 WinForms 中,WebBrowser控件具有Document类型为 的属性HtmlDocument。该HtmlDocument实例具有返回实例的属性/方法,如FormsLinksGetElementsByTagName()HtmlElementCollection。当我迭代一个HtmlElementCollection我得到HtmlElement实例。这些HtmlElement实例具有DomElement引用底层 COM 对象的属性。我的问题是,我应该Marshal.ReleaseComObject()在这些HtmlElement实例上调用方法还是 WinForms 在内部管理引用?

4

2 回答 2

4

手动内存管理总是一个坏主意,尤其是对于 COM 对象。您可以从专家那里获得关于它的意见,Visual Studio 团队的博客文章很好地说明了这一点。

万一您仍然认为这是一个好主意,Winforms 团队已经为您做出了决定。由 HtmlDocument、HtmlElement、HtmlWindow、HtmlElementCollection 等类包裹的接口指针是该类的私有变量。你根本无法做到这一点,无论如何都要打破书中的每一条规则。

出现问题并非完全不可能,这些包装类对象非常小,因此您可能会遇到垃圾收集器运行频率不足以确保释放底层 COM 对象的问题。GC.Collect() 是它的后备。仅在必要时使用它。

于 2013-07-25T22:15:33.527 回答
1

如果不调用ReleaseComObject函数,winforms会自动释放对象。msdn 说它可以用来控制对象的生命周期,但不是必须的。

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx

于 2013-07-30T20:52:49.460 回答