投稿者 魔界の仮面弁士  (社会人) 投稿日時 2012/3/22 23:18:57
System.Windows.Forms.HtmlDocument 等で示される DOM (ドキュメント オブジェクト モデル)は、
COM(ActiveX)版のDOM を、.NET から扱いやすくするためにカプセル化したものです。
COM 版の具体的な API 定義は、MSHTML というライブラリにまとめられています。
http://msdn.microsoft.com/en-us/library/aa741317.aspx
http://msdn.microsoft.com/en-us/library/Aa752574.aspx
http://msdn.microsoft.com/en-us/library/aa752574.aspx


しかし、.NET でのカプセル化は十分なものではないため、それを解消できるよう、
大本のアンマネージ インターフェイスにもアクセスできるような作りになっています。

具体的には、HtmlDocument クラスの DomDocument プロパティや
HtmlWindow クラスの DomWindow プロパティ、それに
HtmlHistory クラスの DomHistory プロパティが該当します。

もちろん、HtmlElement クラスの DomElement プロパティもそうですし、あるいは
WebBrowser コントロールの ActiveXInstance プロパティなどもこれに近い仕組みです。


> 変数を使い終わったらReleaseComObjectということをしているようですが 
それは COM オブジェクトを使った後に、後始末として呼ぶメソッドですが、
サンプルコードをあまり複雑にすると本題部分が分かりにくくなるため、今回は記述していません。

ちなみに別スレッドに投稿した、アンマネージの createTextRange メソッドを呼び出すサンプルにて
http://rucio.cloudapp.net/CommentDetail.aspx?ThreadId=10769&CommentId=23111
あえてそのソースを「手抜き実装」と評していますが、これは、createTextRange で得たオブジェクトを
ReleaseComObject していないというのが、その発言理由の一つです。
(他にも、ページ遷移中に ListBox 操作された場合の対処漏れなどの「手抜き」があります)

とはいえ、無理に ReleaseComObject せずとも、「いずれは」ファイナライザにて
後始末が行われるわけですから、回収タイミングがシビアではないケースにおいては、
明示的に回収せず、ガベージコレクタに任せておくだけでも十分と言えます。


しかし、確保していたオブジェクトが占有性の高い資源であった場合は別です。
「いずれ」ではなく「使わなくなったら即時に」解放しないと、それらを他のプログラムが
利用できなくなってしまいますので、その場合はマネージかアンマネージかを問わず、
他で使われていないことが保証できた時点で、すぐに後始末しておいた方が良いでしょう。
また、解放順序が意味を持つようなオブジェクトの場合も、明示的に後処理すべきです。

具体例を挙げるなら、COM のアウトプロセスサーバー(Excel 等)へのアクセス時や、
短時間の間に連続して幾度も繰り返されし確保されるアンマネージリソースなどでしょうか。
あるいはデータベースやファイル操作、COMポート操作時なども、即時解放が望ましいでしょうね。