C ++ / CLIIDisposable
は、refクラスにデストラクタを実装するときに、スキャフォールディングを生成するのに役立ちます。また、デストラクタを実装していないが、クラスにを実装するメンバー変数があるIDisposable
場合IDisposable
は、クラスに再び自動的に実装されます。IDisposable
これは非常に便利で、C#での処理方法よりもはるかに優れています。
msclr::com::ptr
(RCWを含むスマートポインター)を保持するrefクラスを実装するときに、この動作に遭遇しました。
ref class Test /* : IDisposable added by the compiler */
{
msclr::com::ptr<IWhatever> _aComObject;
}
私の特定のケースでは、クラスによって参照されるCOMオブジェクトは、一部のアンマネージリソースを「ロック」せず、CLRが認識できないアンマネージメモリを事実上消費します。したがって、クラスを実装しないことで、refクラスのユーザーを混乱させないようにしたいと思いますIDisposable
。代わりに、GC APIを使用して適切なメモリプレッシャーを追加することにより、CLRにCOMオブジェクトの存在を認識させたいと思います。
したがって、問題は次のとおりです。IDisposable
デストラクタを実装していないが、IDisposable
メンバー変数を保持しているrefクラスでの実装を抑制する方法はありますか?
注意:これは、クラスのユーザーが基になるCOMオブジェクトを決定論的に破棄できないため、間違ったことになることがよくありますが、特定の状況を考えると、公開するIDisposable
と、refクラスのユーザーを混乱させる可能性があります。問題のrefクラスを破棄する必要はありません。
1つのオプションは、デストラクタなしでmsclr :: com::ptrのバリアントを実装することだと思います。
IDisposableの自動追加を抑制する他の方法をいただければ幸いです。ありがとう。
答え
_aComObject
msclr :: com :: ptr()へのハンドルとして宣言しmsclr::com::ptr<IWhatever>^
ます。その場合、コンパイラはTest
com ptrオブジェクトの「所有者」であるとは見なさず、Testが削除されたときにそれを破棄しません。