我有一个文本编辑器控件srtitten与VB 6.0或VC 6.0,现在我们在refrences中有一个AxInterop,我把它放在.NET自定义控件中,并一直使用它。所以现在我想知道这是否被视为Maanged资源或非托管资源?问这个的原因是我正在运行一个内存分析器工具并查看它的图形,我看到分配给非托管资源的60MB内存..所以想知道这是否是罪魁祸首?
答案 0 :(得分:2)
COM包装器是“Runtime Callable Wrappers”并且是受管资源。分配给“非托管资源”的60MB内存本身不是包装器,但很可能是由于底层COM对象的生命周期通常与RCW的生命周期相关联。
答案 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);
}
}
结论:原始句柄是本机资源,但在类中包装本机资源的类是受管资源。 (严格来说,托管资源是一个包装本机或托管资源的类。即任何包含我们的包装器的类都将是托管资源。)