2017-02-08 5 views
1

私は実際にAPI呼び出しを使用する必要がある.NETアプリケーションを作成しています。私のアプリケーションはWin APIの関数CoCreateInstance()を呼び出してCOMインターフェイスを取得します。Marshal.Release()には暗黙のReliabilityContractがありますか?

もちろん、これらのインターフェイスを終了するときにそれらのインターフェイスを解放する必要があります。私はそうする適切な方法はMarshal.Release()(少なくとも、他の合理的な方法は私の心に来ている)だと思います。

ここでは、それぞれのインターフェイスポインタを安全なハンドルにしたいと考えています。そのためには、自分のセーフハンドルクラスをSafeHandleから派生させ、派生クラスでReleaseHandle()をオーバーライドする必要があります。 respective documentation状態は:

[...]特に、あなたがReleaseHandleから呼び出す任意のメソッドにReliabilityContractAttribute属性 を適用します。ほとんどの場合、このコード する必要があります:ReliabilityContract(Consistency.WillNotCorruptState、 Cer.Success)[...]

は、これは私の問題です:​​はすでにデフォルトでこの契約を持っている場合、私は知らない、とそうでない場合は、どうやって追加することができます。私はここにいくつかの基本が欠けていると思う。誰かがそこに光を当ててください。

+0

Windows APIはウィンドウ割り当てメソッドを使用し、メモリはNetライブラリルールではなくWindowsルールに基づいて解放されます。メモリを保持するWin APIのみがWindowsメソッドを使用してリリースする必要があります。 – jdweng

+0

これは当てはまるかもしれませんが、ここでの状況には当てはまりません。 COMインターフェイスには特別な状況があります。私の質問は、COMインターフェイスの取得と解放(基本的には参照カウンタの増減を意味します)に関連し、メモリ領域の割り当てや解放は関係ありません。ちなみに、COMオブジェクト*は、すべてのインタフェースの参照カウンタがゼロになった場合、自分自身で破壊することに気付いているかもしれません(ただし、私の質問とは関係ありません)。 – Binarus

+1

コードをチェックするだけでこれに答えますか?抽象メソッドには[ReliabilityContract(Consistency.WillNotCorruptState、Cer.Success)]という属性があります。 – Will

答えて

2

抽象メソッドMarshal.Releaseの定義は

[System.Security.SecurityCritical] // auto-generated_required 
[ResourceExposure(ResourceScope.None)] 
[MethodImplAttribute(MethodImplOptions.InternalCall)] 
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
public static extern int /* ULONG */ Release(IntPtr /* IUnknown */ pUnk); 

あるので、それはすでにReliabilityContractAttributeで飾られています。逆コンパイラ(私はJustDecompileを使用しました)を使用するか、referencesource.microsoft.comにあるすべてのフレームワークタイプのソースを調べることができます。

+0

答えを受け入れるには、おそらく'Marshal.Release()'( 'SafeHandle.ReleaseHandle()'の代わりに):-) – Binarus

+0

@Binarus Hah!私は回り込んだ、はい。更新しました。 – Will

関連する問題