7

dynamicクラスのプライベート フィールドとして COM オブジェクトがあります。それが管理対象リソース (GC によってクリーンアップされる) と見なされるかどうかはわかりません。

private dynamic _comConnector = null;

...

_comConnector = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));

IDispose を実装する場合、マネージド リソース (Dispose() が明示的に呼び出された場合のみ) またはネイティブ リソース (ファイナライザーからも Dispose(false) が呼び出された場合) としてクリーンアップする必要がありますか?

private void Dispose(bool disposing)
{
    if (disposing)
    {
        // Free managed resources //

        // --> Should I call Marshal.FinalReleaseComObject(_comConnector) here?
    }

    // Free unmanaged resources //

    // --> Or maybe here?
}
4

2 に答える 2

6

これは管理対象リソース(基本的にはRuntime Callable Wrapper)であり、そのようにクリーンアップする必要があります。 MSDNは次のように述べています。

各RCWは、ラップするCOMオブジェクトのインターフェイスポインターのキャッシュを維持し、RCWが不要になると、COMオブジェクトの参照を解放します。ランタイムはRCWでガベージコレクションを実行します。

つまり、RCWは、アンマネージCOM参照をラップするマネージリソースです。

余談ですが、Chris Brummeのこのブログ投稿で説明されているように、COMオブジェクトをアプリケーションの複数の場所で複数のスレッドから使​​用している場合、COMオブジェクトを解放することは危険です。

スコープ付きのシングルスレッド方式でCOMオブジェクトを使用している場合は、使い終わったらそのオブジェクトでReleaseComObjectを安全に呼び出すことができます。うまくいけばこれが当てはまります。

于 2012-09-18T07:53:13.290 に答える
0

1 COM はコンポーネントなので、彼が何をするかによってすべてが決まります。以下の機能を満たしている場合

  • ファイルを開く

  • ネットワーク接続を開く

  • アンマネージ メモリ

  • XNA の場合: 頂点バッファー、インデックス バッファー、テクスチャなど。

=>そうです、それは管理されていないリソースです

ガベージ コレクターはこのリソースに関する情報を持っていないため、クリーンアップはユーザー向けです

2クリーンには、メソッドを使用するだけですDispose(またはブロックを使用して、治療の最後にdisposeを呼び出します)。

于 2012-09-18T07:48:26.317 に答える