tag:blogger.com,1999:blog-9048341464672266161.post824218229566510056..comments2023-09-20T21:44:59.063+09:00Comments on 青柳 臣一 ブログ(技術系): [.NET][COM] Marshal.ReleaseComObject の危険性について青柳 臣一http://www.blogger.com/profile/05528524357085013331noreply@blogger.comBlogger1125tag:blogger.com,1999:blog-9048341464672266161.post-23908407652043300182009-07-07T21:37:20.000+09:002009-07-07T21:37:20.000+09:00> Marshal.FinalReleaseComObject を使うべき。 「呼び出しがすで...> Marshal.FinalReleaseComObject を使うべき。<br> 「呼び出しがすでにリリースされた RCW に行われると、その振る舞いは未定義である。」の問題をクリアしているわけではないですよね。<br>http://msdn.microsoft.com/ja-jp/library/8bwh56xe.aspx<br> ここにある図でいうと、ReleaseComObject が返す(デクリメントする)「参照回数」というのは、RCW の右(マネージ側)にある参照回数なのでしょうか。それとも左(アンマネージ側)にある参照回数なのでしょうか。<br>Marshal.ReleaseComObject の、戻り値の説明には、<br>「<br>ランタイム呼び出し可能ラッパーは、ラップされた COM オブジェクトへの参照を、それを呼び出しているマネージ クライアントの数に関係なく、1 つしか保持しないためです。<br>」<br>と、書かれています。それでありながら、解説には<br>「<br>同じ COM インターフェイスがアンマネージ コードからマネージ コードに複数回渡された場合、ラッパーの参照カウントは毎回インクリメントされ、ReleaseComObject を呼び出すと、残りの参照の数が返されます。<br>」<br>と書かれています。同じ事が書かれていると思えないです。<br> また、「ランタイム呼び出し可能ラッパー」の図では、複数の .NET クライアントが1回ずつ参照しているように見えます。1つの .NET クライアントが複数回参照した場合、参照回数はどのようになるのでしょう?<br> でも、わかんないなぁ。。。参照すると、参照カウンタが上がりますよね。ReleaseComObject は、「参照カウンタを1減じて、0になったときに COM をリリースする」のですよね。そうであるなら、2つのオブジェクトが参照しているなら、参照カウンタは2になっており、片方が ReleaseComObject をしても、参照カウンタは1になるのであって0ではないので、解放は起こらないのでは?もちろん、参照カウンタへのアクセスがシリアル化されている事が前提ですが。<br> ということを質問した人がいるみたい。 http://blogs.msdn.com/yvesdolc/archive/2004/07/21/190691.aspx ここの1中で、But then someone asked です。<br>��.リリースしたら、そのオブジェクトは使わないはずだから、別にかまわないよね。<br>��.複数のスレッドで参照しても、参照カウンタで管理しているはずだよね。<br>それに対する Dave の回答が、よくわからない。<br>��.RCW が呼び出しを最適化して、その最適化された呼び出しの最下層にある参照をリリースすると、AV が発生する。<br>��.両方のスレッドが MTA なら、リリースの必要はまったくない。だから、MTA スレッドから ReleaseComObject を呼び出すと、AV やメモリ不正が発生する確率を高める。<br>��はともかく、2は、え~???<br>Jittanoreply@blogger.com