COM サーバーを呼び出してメモリを割り当てるマネージ オブジェクトがあります。マネージ オブジェクトは、メモリ リークを回避するために、マネージ オブジェクトがなくなる前にそのメモリを解放するために、再度 COM サーバーを呼び出す必要があります。このオブジェクトIDisposableは、正しいメモリ解放 COM 呼び出しが確実に行われるようにするために実装されます。
Disposeメソッドが呼び出されない場合は、オブジェクトのファイナライザーにメモリを解放してもらいたいです。問題は、ファイナライズの規則では、参照にアクセスしてはならないということです。これは、他のどのオブジェクトが既に GC および/またはファイナライズされているかわからないためです。これにより、タッチ可能なオブジェクトの状態はフィールドのみになります (ハンドルが最も一般的です)。
しかし、COM サーバーを呼び出すには、フィールドに格納する Cookie のメモリを解放するために、ランタイム呼び出し可能ラッパー (RCW) を経由する必要があります。 そのRCWはファイナライザーから安全に呼び出すことができますか(この時点でGCまたはファイナライズされていないことが保証されていますか)?
ファイナライズに慣れていない方のために説明すると、ファイナライザー スレッドはマネージド アプリドメインの実行中にバックグラウンドで実行されますが、参照に触れることは理論的には問題ありません。参照関係の順序で。これにより、ファイナライザーから触れても安全であると想定できるものが制限されます。管理対象オブジェクトへの参照は、参照が null でない場合でも、「不良」(収集されたメモリ) である可能性があります。
更新:試してみたところ、これが得られました:
タイプ 'System.Runtime.InteropServices.InvalidComObjectException' の未処理の例外が myassembly.dll で発生しました
追加情報: 基礎となる RCW から分離された COM オブジェクトは使用できません。