6

最近まで、.NET ランタイムは、ランタイム呼び出し可能ラッパーを作成するときに COM オブジェクトの参照カウントを 1 だけ増加させ、特定の COM オブジェクトに対してそのようなランタイム呼び出し可能ラッパーを 1 つだけ作成すると信じていました。

私が間違っていなければ、上記はMarshal.FinalReleaseComObjectMarshal.ReleaseComObjectが実際には同じことを行うことを意味します。

ただし、今日、COM オブジェクトがコードによって適切に解放されることを確認するためのテストを作成していました。これを行うには、リリースされたと思われるオブジェクトを呼び出し、期待されるInvalidComObjectException. の後に例外がスローされ、 の後に例外がスローされない場合があることが判明しましFinalReleaseComObjectReleaseComObject

これは、.NET 2.0 ランタイムが COM オブジェクトへの複数の参照を保持できるということですか? もしそうなら、いつこれをしますか?

4

1 に答える 1

5

ここには、余分なレベルの間接参照があります。はい、RCWはネイティブCOMインターフェイスポインタで単一の参照カウントを保持します。ただし、RCWにも参照カウントがあり、COMインターフェイスポインターがRCWにマップされるたびに増分されます。これは、COMメソッドがインターフェイスポインタを返す場合に発生する可能性があります。対応する.NETラッパークラスのファイナライザーはそれをデクリメントします。

その参照カウントを、ファイナライザーのように1つ減らすMarshal.ReleaseComObject()と、ゼロにザッピングするMarshal.FinalReleaseComObject()を介して直接調整して、IUnknown :: Release()メソッドが呼び出されるようにすることができます。 。もちろん、彼らは「あなたが何をしているのかをよりよく知る」カテゴリーに分類されます。間違えると、醜くてデバッグ不可能な「基になるRCWから分離されたCOMオブジェクト」例外が発生します。

于 2010-04-02T15:10:03.480 に答える