2011-10-21 17 views
2

我正在使用C++/CLI for C庫。我在網上探索過它。我有幾個關於它的鏈接。爲靜態庫設計託管DLL(C++/CLI)

Mixed mode C++/CLI performance considerations - best practices

我開發一個C++/CLI DLL將包裹一個C靜態庫。

有一個建議,我真的想在這裏討論的是「不應該在包裝中混合使用託管和非託管C++代碼」。我不明白它的意思。

託管的DLL當然會包含託管C++代碼和非託管C++代碼。

包裝的目的是將調用從靜態庫轉換爲託管代碼DLL。

請清除我的疑惑 - 我想對此發表評論。

+0

您可能應該添加網址以找到'您應該混淆......'報價的位置。我仍然不清楚你在問什麼。 –

+0

@JonathanLeffler更新了問題 –

+1

您的URL(另一個SO問題)顯示「您不應該混合託管代碼和非託管代碼」,這與您引用的內容不同。缺少'不'可以完全破壞一個問題。 –

回答

2

如果您有一個常規C++庫(非CLI),出於性能原因,應該避免爲該庫打開「CLI」編譯選項。

相反,最好創建一個只包含包裝類的庫。這個庫當然是C++/CLI,並且會創建一個可以被常規.Net庫引用的程序集。

所以這可能是什麼意見,將談論 - 爲您的CLI包裝

創建一個包裝庫

- 增編爲更新的問題

託管C++/CLI類不應該包含非託管代碼,因爲它/不能/包含許多類型的非託管代碼。

例如,C++/CLI類不能有任何不是引用或指針的非託管成員變量。這是因爲.Net運行時垃圾收集器可能會隨時決定將對象放在內存中的任何位置(這是您需要固定內存等原因)。如果GC決定將原生C++對象移動到內存中的其他位置,這可能會使您對該對象的任何指針失效。這顯然是不好的。

C++/CLI是一門偉大的語言。但是,如果您使用它,您應該決定編寫純淨的.Net代碼,或者您應該將其用作本機C++和.Net之間的接口。在同一個類中混合使用內存模型只會混淆事物。

+0

我的C靜態庫編譯沒有clr.You的意思是說包裝應該與編譯出Clr選項。 –

+0

很抱歉,我沒有注意到你的評論。包裝器在不同的庫中,可能有/ clr,因爲大部分代碼都是CLR – Cechner