在WinForms中,WebBrowser
控件在Document
类型中具有HtmlDocument
属性。 HtmlDocument
实例具有返回Forms
个实例的Links
,GetElementsByTagName()
,HtmlElementCollection
等属性/方法。当我迭代HtmlElementCollection
时,我收到了HtmlElement
个实例。这些HtmlElement
实例具有DomElement
属性,这是对底层COM对象的引用。我的问题是,我应该在这些Marshal.ReleaseComObject()
实例上调用HtmlElement
方法,还是WinForms在内部管理引用?
答案 0 :(得分:4)
手动内存管理总是一个坏主意,尤其是COM对象。您可以从专家处获得有关它的意见,Visual Studio团队的blog post可以很好地回归。
如果您仍然认为这是一个好主意,Winforms团队已经为您做出了决定。由HtmlDocument,HtmlElement,HtmlWindow,HtmlElementCollection等类包装的接口指针是该类的私有变量。你根本无法做到这一点,无论如何都不能打破书中的每一条规则。
问题并非完全不可能,这些包装类对象非常小,因此可能出现问题,垃圾收集器运行频率不足以确保释放基础COM对象。 GC.Collect()是后备的。只在必要时使用它。
答案 1 :(得分:1)
如果不调用ReleaseComObject函数,winforms会自动释放这些对象。 Msdn说它可以用来控制对象的生命周期,但没有必要。
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx