4

WinForms では、WebBrowserコントロールにはDocumenttype のプロパティがありますHtmlDocument。インスタンスには、インスタンスを返す 、 、 などのプロパティHtmlDocument/メソッドがあります。を繰り返し処理すると、インスタンスが取得されます。これらのインスタンスには、基になる COM オブジェクトへの参照であるプロパティがあります。私の質問は、これらのインスタンスでメソッドを呼び出す必要がありますか、それとも WinForms が内部で参照を管理するのですか?FormsLinksGetElementsByTagName()HtmlElementCollectionHtmlElementCollectionHtmlElementHtmlElementDomElementMarshal.ReleaseComObject()HtmlElement

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 に答える