2008-09-16 78 views

回答

3

有幾條路線你可以用這個 - 一個,你可以更新你的非託管C++庫有一個託管的C++擴展包裝它們並讓C#直接利用這些類。這有點費時,但它爲傳統非託管代碼提供了一個很好的橋樑。但請注意,受管理的C++擴展有時難以瀏覽自己,因爲它的語法與非託管C++相似,但足夠接近以至於訓練有素的人員能夠看到差異。

另一條路線是讓你的umnanaged C++實現COM類,並讓C#通過自動生成的interop程序集使用它。如果你足夠熟悉COM的話,這種方法更容易。

希望這會有所幫助。

0

您也可以通過P/Invoke調用非託管代碼。如果你的代碼目前不使用COM,這可能會更容易。我想你可能需要在你的代碼中使用「C」綁定編寫一些特定的導出點,如果你走這條路線的話。

也許你已經在我的經驗,要留意的最重要的事情是,缺乏確定性垃圾收集的意思是,當你可能會認爲他們會以前在析構函數將不會運行。您需要牢記這一點,並使用IDisposable或其他方法來確保您的託管代碼在您希望的時候被清理乾淨。

1

您正在描述P/Invoke。這意味着您的C++庫將需要通過DLL接口公開自己,並且接口將需要足夠簡單以通過調用屬性描述P/Invoke。當託管代碼調用到不可控制的世界時,參數必須被編組,因此它似乎有可能是輕微的性能損失,但你必須做一些測試,看看編組是顯著與否。

0

當然,如果您將代碼打包爲具有外部入口點的DLL,那麼總是會出現PInvoke。沒有任何選擇是無痛的。它們依賴於:a)你在編寫COM或託管C包裝器方面的技能; b)在PInvoke中查找你的手臂。

1

最簡單的方法就是確保所有的C++功能都暴露爲'C'風格的功能。確保將函數聲明爲_stdcall。

的extern 「C」 __declspec(dllexport)的INT _stdcall美孚(INT一)

確保你得到的編組權利,特別是像指針的東西& wchar_t的*。如果你弄錯了,可能很難調試。來自任何一方,但不能同時

調試。在調試混合本機&時,調試器可能會變得非常慢。一次調試一面可以節省大量時間。

獲得更具體的需要一個更具體的問題。

0

我會看看swig,我們利用這個良好的效果在我們的項目,我們的C++ API暴露在其他語言平臺。

這是一個維護良好的項目,它可以有效地在您的C++庫中構建一個可以允許C#等語言與您的本機代碼直接通信的瘦包裝程序,從而爲您節省必須實施(和調試)粘合代碼的麻煩。

0

如果您想要一個好的PInvoke示例,您可以查看PInvoke.net。它有如何調用大多數win API函數的例子。

此外,您可以使用本文中的工具Clr Inside Out: PInvoke將您的.h文件轉換爲c#包裝。