2012-11-28 182 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