0

私は VB 6.0 または VC 6.0 で作成されたテキスト エディター コントロールを持っていますが、現在はそのための AxInterop が参照にあり、それを .NET カスタム コントロールに入れて、そのように使用しています。では、これが Maanged リソースと見なされるのか、それとも管理されていないリソースと見なされるのか疑問に思っています。これを尋ねる理由は、私がメモリ プロファイラー ツールを実行していて、そのグラフを見ると、アンマネージド リソースに 60MB のメモリが割り当てられているように見えるからです。

4

2 に答える 2

2

COM ラッパーは「ランタイム呼び出し可能ラッパー」であり、マネージ リソースです。「アンマネージ リソース」に割り当てられた 60 MB のメモリは、ラッパー自体ではありませんが、一般に RCW の有効期間に関連付けられている基になる COM オブジェクトの結果である可能性があります。

MSDN のランタイム呼び出し可能ラッパーを参照してください。

于 2012-11-28T17:48:17.317 に答える
1

簡単に言うと、すべてのラッパーはマネージ リソースであり、COM ラッパーでもあります。長い話自体はありません。

.NET では、マネージド リソースとアンマネージド リソースが単純に分離されています。IntPtrアンマネージ リソースは、アンマネージ ワールドから取得された未加工のハンドルやその他の低レベルの「ハンドル」など、CLR が認識していないものです。

// handle is a native resource
IntPtr handle = ObtainResourceFromNativeWorld();

// ... using handle

// Releasing resource
ReleaseResourceToNativeWorld(handler);

しかし、これをメソッドとのインターフェースをIntPtr実装するクラスにラップすると、このクラス自体がマネージド リソースになります。IDisposableFinalizer

// NativeWrapper is a managed resource
class NativeWrapper : IDispoable
{
  // _handle is a native resource
  private readonly IntPtr _handle;

  public NativeWrapper()
  {
    _handle = ObtainResourceFromNativeWorld();
  }

  public void Dispose()
  {
    Dispose(true);
  }

  ~NativeWraper()
  {
    Dispose(false);
  }

  private void Dispose(bool disposing)
  {
    // because we're dealing with native resources
    // we should release them from both: Dispose method and Finalizer
    ReleaseResourceToNativeWorld(_handle);
  }
}

結論: raw ハンドルはネイティブ リソースですが、ネイティブ リソースをクラスにラップするクラスはマネージド リソースです。(厳密に言えば、管理対象リソースは、ネイティブまたは管理対象リソースをラップするクラスです。つまり、ラッパーを含むすべてのクラスも管理対象リソースになります)。

于 2012-11-28T18:32:22.363 に答える