我有一個文本編輯器控件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