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