我想從我的C#代碼中調用我的非託管C++庫。需要採取哪些潛在的陷阱和預防措施?感謝您的時間。在Windows上用Visual Studio混合C#代碼和未被管理的C++代碼
回答
這個問題太廣泛了。唯一合理的答案是P/Invoke,但這就好像在說如果你想爲Windows編程,你需要知道Win32 API。
幾乎整本書都有關於P/Invoke(http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X),當然還有整個網站已經制作完成:http://www.pinvoke.net/。
有幾條路線你可以用這個 - 一個,你可以更新你的非託管C++庫有一個託管的C++擴展包裝它們並讓C#直接利用這些類。這有點費時,但它爲傳統非託管代碼提供了一個很好的橋樑。但請注意,受管理的C++擴展有時難以瀏覽自己,因爲它的語法與非託管C++相似,但足夠接近以至於訓練有素的人員能夠看到差異。
另一條路線是讓你的umnanaged C++實現COM類,並讓C#通過自動生成的interop程序集使用它。如果你足夠熟悉COM的話,這種方法更容易。
希望這會有所幫助。
您也可以通過P/Invoke調用非託管代碼。如果你的代碼目前不使用COM,這可能會更容易。我想你可能需要在你的代碼中使用「C」綁定編寫一些特定的導出點,如果你走這條路線的話。
也許你已經在我的經驗,要留意的最重要的事情是,缺乏確定性垃圾收集的意思是,當你可能會認爲他們會以前在析構函數將不會運行。您需要牢記這一點,並使用IDisposable或其他方法來確保您的託管代碼在您希望的時候被清理乾淨。
您正在描述P/Invoke。這意味着您的C++庫將需要通過DLL接口公開自己,並且接口將需要足夠簡單以通過調用屬性描述P/Invoke。當託管代碼調用到不可控制的世界時,參數必須被編組,因此它似乎有可能是輕微的性能損失,但你必須做一些測試,看看編組是顯著與否。
當然,如果您將代碼打包爲具有外部入口點的DLL,那麼總是會出現PInvoke。沒有任何選擇是無痛的。它們依賴於:a)你在編寫COM或託管C包裝器方面的技能; b)在PInvoke中查找你的手臂。
最簡單的方法就是確保所有的C++功能都暴露爲'C'風格的功能。確保將函數聲明爲_stdcall。
的extern 「C」 __declspec(dllexport)的INT _stdcall美孚(INT一)
確保你得到的編組權利,特別是像指針的東西& wchar_t的*。如果你弄錯了,可能很難調試。來自任何一方,但不能同時
調試。在調試混合本機&時,調試器可能會變得非常慢。一次調試一面可以節省大量時間。
獲得更具體的需要一個更具體的問題。
我會看看swig,我們利用這個良好的效果在我們的項目,我們的C++ API暴露在其他語言平臺。
這是一個維護良好的項目,它可以有效地在您的C++庫中構建一個可以允許C#等語言與您的本機代碼直接通信的瘦包裝程序,從而爲您節省必須實施(和調試)粘合代碼的麻煩。
如果您想要一個好的PInvoke示例,您可以查看PInvoke.net。它有如何調用大多數win API函數的例子。
此外,您可以使用本文中的工具Clr Inside Out: PInvoke將您的.h文件轉換爲c#包裝。
- 1. Windows上的Visual Studio代碼,C#支持
- 2. 在Windows上調試Visual Studio代碼中的C#代碼
- 3. Visual Studio 2010,C#和DirectX託管代碼
- 4. 混合Objective-C和C++代碼
- 5. 將VB.net代碼與c#代碼混合
- 6. C#的Visual Studio代碼#
- 7. 在Visual Studio上支持C++代碼
- 8. 使用C#Windows窗體管理代碼
- 9. 如何在mac上的visual studio代碼中執行C#代碼
- 10. Visual Studio C#代碼顏色
- 11. 評論C++代碼,visual studio
- 12. C#FileNotFoundException未被用戶代碼處理
- 13. 管理C#代碼片
- 14. 傳遞到C代碼從C#代碼在Visual Studio
- 15. 混合託管和非託管C++代碼?
- 16. DirectoryNotFoundException由用戶代碼未處理? (Visual Studio 2013,C#)
- 17. Visual Studio 2010中的源代碼管理?
- 18. 如何檢測Visual Studio 2005中未引用的C/C++代碼?
- 19. 混合使用C和C++代碼的產量在GCC
- 20. C#錯誤代碼管理
- 21. 什麼是在Visual Studio的C++代碼
- 22. 混合C/C++源代碼:在C代碼中獲取sizeof(C++ struct)
- 23. Visual Studio 2012源代碼管理
- 24. 使用Visual Studio管理源代碼管理中的引用
- 25. 在Visual Studio中查找源代碼(C#)
- 26. 在Visual Studio 2010中發佈代碼C#
- 27. 在Visual Studio中刪除未使用的C#代碼
- 28. 混合processing.js代碼和JavaScript代碼
- 29. 從C#託管代碼調用win32 CreateProfile()管理代碼
- 30. 在Visual Studio代碼中構建一個C++程序代碼
不會使用__dll_exports在任何Win32 DLL上進行P/Invoke工作? – 2009-02-18 11:59:42