COM Wrappers:它们是托管资源还是非托管资源?

时间:2012-11-28 17:44:17

标签: c#

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

2 个答案:

答案 0 :(得分:2)

COM包装器是“Runtime Callable Wrappers”并且是受管资源。分配给“非托管资源”的60MB内存本身不是包装器,但很可能是由于底层COM对象的生命周期通常与RCW的生命周期相关联。

请参阅Runtime Callable Wrapper on MSDN

答案 1 :(得分: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);
  }
}

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

相关问题