タイトル : COMの解放に関して 投稿日 : 2006/02/16(Thu) 10:44 投稿者 : 魔界の仮面弁士
# COM Interop に関する .NET 1.0/1.1/2.0 の動作に関しては、 # 私もまだ調査中の段階だったりします…。(^^; > ・COMオブジェクトの解放を上記のように記述するのは安全のためですか,それともこう記述しないと > 解放されないのですか? その両方です。 解放処理の記述についてですが、それぞれの判定に対しては、 Not O Is Nothing → null参照を解放できるわけがないので、記述しておく Marshal.IsComObject(O) → Marshal.ReleaseComObject(O) の対象となるのは、COMコンポーネントだけなので Whileループ → 特定の状況下で、参照カウントが 2以上になる可能性があるから(この投稿の最後を参照) といった意味があります。(実際には、Tryステートメントブロックを併用すべきですけれどね) もちろん、使用中のオブジェクトを破棄してしまうと、その後のアクセスで例外が出ますから、 誰がいつそのオブジェクトを破棄するべきかは、よく考えねばなりませんね。 > ・HtmlElementをキャストしてAnchorに代入するとHtmlElementとAnchorは同じオブジェクトを参照 > する。だからAnchorを解放すればHtmlElementを解放する必要はない。と,いうことであっていますか? あっていると思います。 ためしに、HtmlElement と Anchor の両方を Marshal.ReleaseComObject して、 その戻り値をチェックしてみてください。参照カウントが共有されている事がわかりますよ。 これは、RCW (ランタイム呼び出し可能ラッパー)では、その COM オブジェクトへの参照が、 複数の マネージ クライアントから参照されていたとしても、そのプロセス内での 参照カウントは一つしか保持されず、増加する事は無いからです。 [RCW (ランタイム呼び出し可能ラッパー)] hhttp://www.microsoft.com/japan/msdn/library/ja/cpguide/html/cpconruntimecallablewrapper.asp [CCW (COM 呼び出し可能ラッパー)] hhttp://www.microsoft.com/japan/msdn/library/ja/cpguide/html/cpconcomcallablewrapper.asp ただし、アウトプロセスな ActiveX EXE のクラスの場合は、話が変わってきます。 プロセス境界を越えて RCW を渡した場合には、COM オブジェクトの参照カウンタを 上げることができるので、参照カウンタが常に 1 に留まるとは限らないからです。 このような場合には、Marshal.ReleaseComObject を複数回呼ぶ必要があります。 具体例を挙げると……たとえば Excel の場合には、 Dim Hs As Excel.HPageBreaks = oWorksheet.HPageBreaks Dim H As Excel.HPageBreak = Hs.Add(oRange) '改ページ挿入 というコードを、レイトバインドにして Dim Hs As Object = oWorksheet.HPageBreaks Dim H As Object = Hs.Add(oRange) '改ページ挿入 のようにすると、.Add 時に oRange の参照カウントが増加してしまうらしく、 Marshal.ReleaseComObject(oRange) を、一回多く呼び出さねばならないようです。 hhttp://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200512/05120042.txt |