在 WinForms 中,WebBrowser
控件具有Document
类型为 的属性HtmlDocument
。该HtmlDocument
实例具有返回实例的属性/方法,如Forms
、Links
、GetElementsByTagName()
等HtmlElementCollection
。当我迭代一个HtmlElementCollection
我得到HtmlElement
实例。这些HtmlElement
实例具有DomElement
引用底层 COM 对象的属性。我的问题是,我应该Marshal.ReleaseComObject()
在这些HtmlElement
实例上调用方法还是 WinForms 在内部管理引用?
问问题
439 次
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 回答