3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(VB.Net)COMオブジェクトを解放する

.Net側からはなるべくCOMを使わないほうがいいといわれてますが、どうしても必要な時は結構あります。

そのときのCOMオブジェクトの解放についてです。

実はCOMについてはよくわかっていません。

ちょうどプログラミングの勉学を始めたのもCOMから.Netへの移行時期であり、当時はJ2EEのほうに注力してたため、現在の会社ではたらくまでほとんど疎遠の技術でした。

とりあえずCOMのインスタンスには参照カウンタというものがあって、自分がどれだけ参照されているかを管理してみたいです。

そして、参照カウンタが0になったら自信を消去して解放という流れみたいです。

で、.NetからCOMを利用する場合はRCW(ランタイム呼び出し可能ラッパー )をいうCOMとCLRとの相互運用レイヤーを通してCOMを参照するみたいです。

このRCWにも参照カウンタがあり、RCWからは唯一のCOMのインスタンスを見に行くらしいです。

つまりはRCWの参照カウンタを空にしてやればCOMオブジェクトも解放されるということでしょうか。

System.Runtime.InteropServices.Marshal.ReleaseComObject メソッドを利用すればこのRCWの参照カウンタを1つ減らせるようです。

ただ、この場合だとCOMのインスタンスをいくつも持ってる場合だとループでまわして云々しないといけません。

ということで、もっと手軽に使えるようにするため、.Net2.0からは

System.Runtime.InteropServices.Marshal.FinalReleaseComObject メソッドが追加された見たいです。

これは実行すると参照カウントを 0 に設定することによって、RCW へのすべての参照を解放するようです。

一気に解放したい時に使えそうです。

参考:MS:第 7 章 「相互運用パフォーマンスの向上」(「Marshal.ReleaseComObject」に解放方法載ってます。全般的にかなり詳しい情報載っています。非常に役立ちます。)