私は実際にAPI呼び出しを使用する必要がある.NETアプリケーションを作成しています。私のアプリケーションはWin APIの関数CoCreateInstance()
を呼び出してCOMインターフェイスを取得します。Marshal.Release()には暗黙のReliabilityContractがありますか?
もちろん、これらのインターフェイスを終了するときにそれらのインターフェイスを解放する必要があります。私はそうする適切な方法はMarshal.Release()
(少なくとも、他の合理的な方法は私の心に来ている)だと思います。
ここでは、それぞれのインターフェイスポインタを安全なハンドルにしたいと考えています。そのためには、自分のセーフハンドルクラスをSafeHandle
から派生させ、派生クラスでReleaseHandle()
をオーバーライドする必要があります。 respective documentation状態は:
[...]特に、あなたがReleaseHandleから呼び出す任意のメソッドにReliabilityContractAttribute属性 を適用します。ほとんどの場合、このコード する必要があります:ReliabilityContract(Consistency.WillNotCorruptState、 Cer.Success)[...]
は、これは私の問題です:はすでにデフォルトでこの契約を持っている場合、私は知らない、とそうでない場合は、どうやって追加することができます。私はここにいくつかの基本が欠けていると思う。誰かがそこに光を当ててください。
Windows APIはウィンドウ割り当てメソッドを使用し、メモリはNetライブラリルールではなくWindowsルールに基づいて解放されます。メモリを保持するWin APIのみがWindowsメソッドを使用してリリースする必要があります。 – jdweng
これは当てはまるかもしれませんが、ここでの状況には当てはまりません。 COMインターフェイスには特別な状況があります。私の質問は、COMインターフェイスの取得と解放(基本的には参照カウンタの増減を意味します)に関連し、メモリ領域の割り当てや解放は関係ありません。ちなみに、COMオブジェクト*は、すべてのインタフェースの参照カウンタがゼロになった場合、自分自身で破壊することに気付いているかもしれません(ただし、私の質問とは関係ありません)。 – Binarus
コードをチェックするだけでこれに答えますか?抽象メソッドには[ReliabilityContract(Consistency.WillNotCorruptState、Cer.Success)]という属性があります。 – Will