2011-06-28 105 views
0

我對非託管代碼中的託管對象有一個好奇的問題。我有這個橋接C++和C#代碼的C++/CLI模塊。我有這樣的結構:gcroot沒有任何價值

template <class T> 
struct ManagedReference 
{ 
    gcroot<T^> addonHost; 
} 

現在,在某些時候,我創建了這個託管引用的實例並設置了addonHost。一切都很好,我可以使用手柄。

enter image description here

然而,在某些情況下(將需要多情境的描述恐怕)的值不能評價:

enter image description here

在這種情況下,調用與addonHost的方法導致「找到入口點」異常。

從截圖中可以看出,它不是兩個不同的實例,兩個不同的句柄。這是一樣的。我不明白在某些情況下如何評估「價值」。也許我可以怎麼做到。因爲它不是空的。

我還應該提及的是,我有幾個gcroot<T>,他們都有這個問題,除了一個是gcroot<System::String>

UPDATE

這是調試器在執行過程中顯示的內容。該對象被創建並可用,然後在某個時間點,該值將「消失」,在下一次調用時它仍然存在。但這是非常可重複的。這不是隨機的。

handle 0x0E1618EC void* 
value 0x106396d8 { m_host=0x10638e04 } <-- object is available here 

handle 0x0E1618EC void* 
value 0x1020e558 { m_host=0x1020e4f0 } <-- object moved in memory 

handle 0x0E1618EC void* 
value          <-- no value here 

handle 0x0E1618EC void* 
value 0x1020e558 { m_host=0x1020e4f0 } <-- object 'is back' 
+0

這是什麼樣的gcroot <>類?微軟擁有一個「手柄」,而不是一個手柄,也沒有任何價值。 –

+0

可能存在調試器無法讀取值的某些對象類型(編譯過的優化過的本機對象,調試器無法正確識別的本地對象),您是否檢查過這些? –

+0

@hans,它是微軟的'gcroot'。是的,它有一個_handle,但是你可以從屏幕截圖中看到調試器顯示一個「句柄」和「值」。當然你也可以自己試試 –

回答

0

也許這將有助於初始化gcroot。試試:

template <class T> 
struct ManagedReference 
{ 
    gcroot<T^> addonHost; 
    ManagedReference() : addonHost(nullptr) {} 
}; 
+0

只是爲了開放想法,我已經嘗試過,但當然沒有任何幫助。'addonHost'在創建實例後立即初始化,並且在大多數情況下我可以使用它的值。 –

+0

@Marius:所以你期待'pInstance-> addonHost'應該總是正確設置(在if語句中應該總是評估爲true)? –

+0

是的,因爲,你看,在初始化之後,這段代碼被多次調用,並且在某些情況下,這個值不是「找到」的(我不知道該如何放置它)。但在此之後的下一個電話,它再次運作 –

相關問題