2012-11-28 112 views
0

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

回答

2

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

Runtime Callable Wrapper on MSDN

+0

太好了。 RCW。当关闭具有此COM包装的表单时,我有时会遇到RCW错误。所以你提到了“然而,这可能是由于底层COM对象的生命周期通常与RCW绑定在一起的结果。”那么我如何确定或调试呢?或者如何正确地释放底层的呢? – Bohn

1

长话短说:任何包装是管理资源和COM包装为好。没有漫长的故事本身。

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

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

// ... using handle 

// Releasing resource 
ReleaseResourceToNativeWorld(handler); 

但是当你包装成实现IDisposable接口Finalizer方法,这个类本身就是一个管理的资源类此IntPtr

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

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

+0

谢谢。那么现在的方法ReleaseResourceToNativeWorld它会是什么样子?它会是一个MArshal.RealseComObject? – Bohn

+1

如果我们手动使用COM对象(没有任何包装器),我想是的,我们可以将ReleaseComObject视为一种将本地资源返回到其世界的方法。 –

+0

谢谢,那么什么是“本土”?我有一个Interop引用它,并且我创建了一个.NET自定义控件,并将该COM放入它,因此被视为一个.NET控件...因此,在这种情况下,我是如何使用它的Native?或者它的.NET版本?谢谢。 – Bohn