私は VB 6.0 または VC 6.0 で作成されたテキスト エディター コントロールを持っていますが、現在はそのための AxInterop が参照にあり、それを .NET カスタム コントロールに入れて、そのように使用しています。では、これが Maanged リソースと見なされるのか、それとも管理されていないリソースと見なされるのか疑問に思っています。これを尋ねる理由は、私がメモリ プロファイラー ツールを実行していて、そのグラフを見ると、アンマネージド リソースに 60MB のメモリが割り当てられているように見えるからです。
2 に答える
COM ラッパーは「ランタイム呼び出し可能ラッパー」であり、マネージ リソースです。「アンマネージ リソース」に割り当てられた 60 MB のメモリは、ラッパー自体ではありませんが、一般に RCW の有効期間に関連付けられている基になる COM オブジェクトの結果である可能性があります。
MSDN のランタイム呼び出し可能ラッパーを参照してください。
簡単に言うと、すべてのラッパーはマネージ リソースであり、COM ラッパーでもあります。長い話自体はありません。
.NET では、マネージド リソースとアンマネージド リソースが単純に分離されています。IntPtr
アンマネージ リソースは、アンマネージ ワールドから取得された未加工のハンドルやその他の低レベルの「ハンドル」など、CLR が認識していないものです。
// handle is a native resource
IntPtr handle = ObtainResourceFromNativeWorld();
// ... using handle
// Releasing resource
ReleaseResourceToNativeWorld(handler);
しかし、これをメソッドとのインターフェースをIntPtr
実装するクラスにラップすると、このクラス自体がマネージド リソースになります。IDisposable
Finalizer
// 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 ハンドルはネイティブ リソースですが、ネイティブ リソースをクラスにラップするクラスはマネージド リソースです。(厳密に言えば、管理対象リソースは、ネイティブまたは管理対象リソースをラップするクラスです。つまり、ラッパーを含むすべてのクラスも管理対象リソースになります)。