人気ブログランキング | 話題のタグを見る
(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」に解放方法載ってます。全般的にかなり詳しい情報載っています。非常に役立ちます。)
by jehoshaphat | 2008-06-19 16:34 | .Net開発


<< (サーバ)非ドメイン環境でWi... (VB.Net)自作コントロー... >>