ただし一部のサービスについては、.NETランタイムの参照カウント>1COMオブジェクト?
-
24-09-2019 - |
質問
最近まであると考えます。NETランタイムのみの参照カウントのCOMオブジェクト1作成時に 実行時の-呼び出し可能オブジェクトのラッパー, は、世界的にもほとんど例のなランタイム-呼び出し可能オブジェクトのラッパーを作成しなCOMオブジェクトです。
がん間違いで、上記のと Marshal.FinalReleaseComObject や Marshal.ReleaseComObject と同じことを行ないます。
しかし、私たちの心の中にしか書いくつかの試験を検証することCOMオブジェクトを適切に公開する私のコードです。私はこのメソッドを呼び出して、はずの公開オブジェクトは、チェックを InvalidComObjectException
. ここで示されているデータがある場合には例外がスローされた後、 FinalReleaseComObject
, な後 ReleaseComObject
.
するということではなく、これま.NET2.0ランタイムで複数の参照COMオブジェクト?その場合、ただし一部のサービスについてはいるのか?
解決
ここ間接の余分なレベルがあります。はい、RCWは、ネイティブCOMインターフェイスポインタ上の単一の参照カウントを保持します。しかし、RCWは、COMインターフェイスポインタがRCWにマッピングされるたびにインクリメントされ、あまりにも参照カウントを持っています。どのCOMメソッドがインターフェイスポインタを返す場合、発生する可能性があります。対応する.NETラッパークラスのファイナライザは、それをデクリメントます。
あなたは直接ファイナライザが行うよう1で、それをデクリメントMarshal.ReleaseComObject()、およびそのIUnknownの::リリース()保証、それをゼロにザップMarshal.FinalReleaseComObject()を介して、その参照カウントをいじくり回すことができますメソッドが呼び出されます。彼ら「より良い何をやっている知っている」カテゴリ内のコース秋の。それは間違って醜いとundebuggable例外「COMオブジェクトは、その基盤となるRCWから分離」を生成するにあたってます。