2012-05-23 172 views
1

我有一個關於混合託管C++與非託管C++幾個具體的問題:混合託管和非託管C++代碼?

  1. 如果我在一個類/結構聲明離開了refvalue,並自動使類/結構的非託管?或者我還需要包含#pragma unmanaged#pragma managed指令?
  2. 非託管和託管類型的兼容性如何?例如,我可以在託管類中擁有一個非託管對象,對嗎?我可以將非託管類/結構傳遞給託管函數嗎(即將std :: string傳遞給託管函數)?

感謝您的幫助,

亞歷

回答

2

你不能有混合型(含管理對象本機類,反之亦然)。有可能的是在本地類中有一個指向託管句柄中的本地類的指針,以及一個包含gcroot模板的託管句柄​​。這是確保垃圾回收器永遠不會嘗試移動本地數據(這會破壞純本機代碼所持有的指針)。

託管類型總是使用託管代碼實現的。如果調用託管類型,則必須使用託管代碼實現本機類型。

#pragma managed(push, off)是強制將代碼編譯爲本地代碼的方式。有幾個原因可以做到這一點:從C++編譯器進行更好的優化,不能被垃圾回收等打斷。或者,你可以使用/clr:pure來強制所有的代碼被編譯爲託管,甚至/clr:safe做同樣的事情和也使其可驗證。

任何編譯爲託管的代碼都可以接受本機類型和託管類型作爲參數並返回值。並且該代碼可以位於託管類型,本機類型或免費(全局)函數中。