.COMでCOMを使用するには、Runtime Callable Wrapperをよく理解している必要があります。基本的には、COMオブジェクトへの参照である.Netコード内のすべてのものは、実際にはRCWへの参照です。 RCWは、基になるCOMオブジェクトの参照カウントを管理することによって参照カウントを管理し、参照カウントが0になると基底オブジェクトのRelease
(1回)を呼び出します。 RCWはライブ中にCOMオブジェクトの単一参照を保持します。
ReleaseComObject
APIは、RCWの参照カウントを1減らします。これにより、RCWの参照カウントが0になると、RCWはRelease
をCOMオブジェクトに呼び出します。 FinalReleaseComObject
もあり、RCWの参照カウントが0になるため(RCWはRelease
になります)、他の参照がRCWに残っているとエラーが発生する場合は危険です。
RCWの参照は、参照を持つオブジェクトがガベージコレクションされたときに管理されます。ガベージコレクションを強制したときにCOMオブジェクトが解放された理由を説明します。これは、RCWの仕組みについて知っていることと相まって、Release
にするためにReleaseComObject
を呼び出すために必要となるRCWに関する他の参照があることを示しています。
ReleaseComObject
を呼び出すと、.Netランタイムの周りで実行されるようになり、作成されたすべての参照を管理するために細心の注意が必要です。作成される参照の中には「暗黙の」参照があります。これらの参照は、呼び出す参照を返すプロパティを呼び出すようにするために起こります。
object.foo.blah.baz.something()
「foo」という、「何とか」と「バズ」おそらくどこかのCOMオブジェクトへのすべての参照ということです。これは、時々、あなたはこのようなものがないとき、「あまりにも多くのドット」の問題として参照されますあなたは考える必要があります。
今私はCOMが気に入らない理由を覚えています。 – OregonGhost
Ha。 COMから来て、この不自由な.Net実装は好きではない理由です.Net! –
時には、私は本当に私がコメントをdownvoteできることを望みますが、ねえ、私は他の1つupvotingでそれを補償している:) – Aamir