管理されていないリソースを取得して解放する必要があるサードパーティのライブラリと通信しています。SafeHandleいくつか読んだ後、リソース参照を管理するための最良かつ「正しい」方法は、またはCriticalHandleオブジェクトのいずれかであるという結論に達しました。
私の問題は、サード パーティのライブラリによって返されるハンドルがポインターではなく、符号なしの短い数値であるため発生します。MarshalAsAttribute返されたハンドルにを指定すると、 が得られますMarshalDirectiveException(CriticalHandles には MarshalAs 属性が設定されていてはならず、配列では使用できません)。
ここに私が検討したものがあります:
- ハンドルを数値形式でマーシャリングし、メソッド
CriticalHandleを介してラップします。Criticalhandle.SetHandleこれにより、参照の取得とカプセル化の間に例外が発生した場合、ハンドルがリークする可能性があります。 - ハンドルを数値形式でマーシャリングして格納します。包含型を実装し
CriticalFinalizerObjectます。これにより、参照の取得とカプセル化の間に例外が発生した場合、ハンドルがリークする可能性があります。 - ハンドルを
SafeHandleとしてマーシャリングしますIntPtr(最上位の 2 バイトを準ガベージで埋めます)。ネイティブDangerousGetHandleメソッドをSafeHandle. これにより、ハンドルの潜在的な漏れを防ぐことができますが、非常に面倒で、力ずくで間違ったソリューションを機能させているように見えます。
これらの「ハンドル」をどのように処理すればよいですか?