我有一个文本编辑器控件srtitten与VB 6.0或VC 6.0,现在我们有一个AxInterop它的refrences,我已经把它放在一个.NET自定义控件,并一直在使用它。所以现在我想知道这是否被认为是一个Maanged资源或非托管资源?问这个问题的原因是我正在运行一个内存分析器工具并查看我看到的分配给非托管资源的60MB内存的图表。我想知道这是不是罪魁祸首?COM包装器:它们是托管还是非托管资源?
0
A
回答
2
COM包装器是“运行时可调用包装器”,并且是受管资源。分配给“非托管资源”的60MB内存本身不是包装,但可能是由于底层COM对象的生命周期通常与RCW绑定的结果。
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);
}
}
结论:原始句柄是原生资源,但在类中包装原生资源的类是托管资源。 (严格地说,托管资源是一个包装本地资源或托管资源的类,即任何包含我们包装的类都将成为托管资源)。
相关问题
- 1. Unity游戏对象是托管还是非托管资源?
- 2. 什么是托管资源和非托管资源?
- 3. 此DLL是管理还是非托管?
- 4. .NET中“托管”与“非托管”资源的含义是什么?
- 5. Microsoft Visual C++ 2003,2005--它们是.Net还是非托管?
- 6. 我的代码是托管还是非托管?
- 7. FileStream是托管还是非托管代码?
- 8. 运行非托管资源
- 9. 非托管资源和Dispose()
- 10. 要托管还是不托管?
- 11. C#类是否可以自动管理非托管资源
- 12. .Net中的托管和非托管资源
- 13. WinRT XAML - 托管和非托管 - 它是如何工作的?
- 14. 为非托管使用包装托管代码
- 15. 为32位和64位非托管DLL创建托管包装
- 16. 托管和非托管堆
- 17. 托管vs非托管
- 18. DirectX托管或非托管?
- 19. 非托管资源分配在哪里
- 20. 以线程处理非托管资源
- 21. 非托管C++ COM和托管C++ .NET4互操作
- 22. 将非托管/非托管成员添加到托管类
- 23. 在混合C++ .NET应用程序中强调托管还是非托管?
- 24. ToolStripMenuItem是否有任何底层的非托管资源?
- 25. 在一次性模式中什么是“非托管资源”?
- 26. 单元测试是否清理了非托管资源
- 27. 包装到非托管代码
- 28. 托管代码是指JIT还是GC?
- 29. 我是否应该将来自“笨”托管包装的对象作为非托管资源对待本机COM dll?
- 30. 什么是托管代码和非托管代码?
太好了。 RCW。当关闭具有此COM包装的表单时,我有时会遇到RCW错误。所以你提到了“然而,这可能是由于底层COM对象的生命周期通常与RCW绑定在一起的结果。”那么我如何确定或调试呢?或者如何正确地释放底层的呢? – Bohn