COM オブジェクトに .NET ラッパーを使用するクラスがありますが、悪名高い RCW エラーが発生しているため、調査の結果、このクラスのファイナライザーから Dispose() メソッドを取り出すと修正されることがわかりました。たとえば、オブジェクトは破棄されていますが、登録されたイベントはまだぶらぶらしています...しかし、Dispose()を削除するだけでは答えになりません。なぜなら、誰がメモリを解放するのでしょうか? (私はメモリ プロファイラを実行し、Dispose メソッドを削除するだけで 20MB の余分な非管理メモリが発生することを確認しました)
だから私がDisposeモデルを使用している方法に何か問題があるはずです..ここに私が持っているものがあります:
private MyCOMobject theCOMobject = null;
static SuppressFieldCntrlr()
{
new SomeCalss();
}
~SuppressFieldCntrlr()
{
Dispose(false);
}
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
theCOMobject.Dispose();
}
MethodFoo(false);
disposed = true;
}
}