0

我有一个带有 VB 6.0 或 VC 6.0 的文本编辑器控件,现在我们在参考中有一个 AxInterop,我已经把它放在一个 .NET 自定义控件中并一直在使用它。所以现在我想知道这是否被视为 Maanged 资源或非托管资源?问这个问题的原因是我正在运行一个内存分析器工具并查看它的图表,我看到分配给非托管资源的 60MB 内存..所以想知道这是否是罪魁祸首?

4

2 回答 2

2

COM 包装器是“运行时可调用包装器”并且是托管资源。分配给“非托管资源”的 60MB 内存不是包装器本身,但很可能是底层 COM 对象的结果,其生命周期通常与 RCW 的生命周期相关联。

请参阅MSDN 上的运行时可调用包装器

于 2012-11-28T17:48:17.317 回答
1

长话短说:任何包装器都是托管资源和 COM 包装器。本身没有长篇大论。

.NET 中托管资源和非托管资源之间存在简单的分离。非托管资源是 CLR 不知道的,例如IntPtr从非托管世界获得的原始句柄和其他低级“句柄”。

// 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);
  }
}

结论:原始句柄是本机资源,但将本机资源包装在类中的类是托管资源。(严格来说,托管资源是一个包装原生或托管资源的类。也就是说,任何包含我们包装器的类也都是托管资源)。

于 2012-11-28T18:32:22.363 回答