我發現在這裏有類似的問題,涉及用C#封裝非託管C++,但它們似乎都是關於特定的實現問題。我想知道使用C#和非託管C++時的一般方法。例如,我有很多用非託管C++編寫的類,我希望能夠通過.NET使用(理想情況下用Excel中的VBA)。到目前爲止,我一直在使用託管的C++/CLI來完成這項工作,但是我注意到了一些我寧願避免使用的語言。進一步閱讀,似乎我可以用C#封裝我的非託管C++,然後直接訪問.NET(同時完全避免託管的C++/CLI)。這是可能的,如果是的話,最好的方法是什麼?感謝您的幫助。圍繞非託管C++的C#包裝器
0
A
回答
1
你有三種選擇:
- 使用C++/CLI包裝。如果您針對.NET,則爲理想的解決方案。您可以訪問.NET世界中的所有內容。你可以用它包裝你的C++庫,然後從C#/ whatever中使用它。
- Ditch .NET,並可能在ATL的幫助下製作一個COM包裝器。這有點難度,但您可以從VBA/Excel更輕鬆地調用您的代碼。如果你願意,你仍然可以從.NET調用你的COM類。
- 將您的代碼編譯爲本地DLL並使用C#中的P/Invoke。請注意,由於沒有任何東西是自動的,因此這個解決方案充其量是乏味的
如果你的目標是真正的Excel/VBA,因爲你要創建COM對象,我會選擇2並直接使用ATL創建COM類。儘管這完全繞開了.NET,但是使用.NET來連接C++代碼和Excel對我來說一直是個麻煩。
1
如果您想完全避免使用C++/CLI並使用純C#來訪問您的本機代碼,那麼它必須通過直接的P/Invoke方法。如果您有大量非託管代碼,這幾乎肯定不是理想選擇。個人而言,我認爲「最佳」解決方案是繼續使用C++/CLI編寫圍繞您的本機代碼的託管包裝,這些代碼公開最簡單的公共接口以降低複雜性。
+2
Pinvoke對C++類無能爲力。只有C風格的函數可以被調整。 –
相關問題
- 1. 圍繞靜態庫託管C++包裝
- 2. C++/CLI圍繞C靜態庫管理的包裝器
- 3. 圍繞非託管代碼包裝的類設計
- 4. 從c#傳遞字符串到非託管c#使用託管C++包裝
- 5. c#包裝器中非託管代碼的Doxygen註釋參數
- 6. 構建C#圍繞C++ lib文件的包裝器
- 7. 我應該爲非託管C++ DLL創建一個C++/CLI包裝器DLL嗎?
- 8. VB6到託管C#方法的C++/CLI包裝器
- 9. COM包裝器:它們是託管還是非託管資源?
- 10. 使用C#/ .NET在C++/CLI中包裝非託管C++模板使用
- 11. C++託管和非託管靜態庫
- 12. 混合託管/非託管C++?
- 13. 託管和非託管C++和Boost
- 14. Gdiplus在C++託管或非託管?
- 15. C++託管到非託管轉換
- 16. C++/CLI託管包裝和ADODB :: Recordset
- 17. 用託管類包裝C++ DLL
- 18. 靜態非託管dll C#包裝和多線程,多域名
- 19. C#中的非託管C++類
- 20. C中的C++非託管DLL#
- 21. 託管C#中的自由非託管C代碼內存
- 22. 託管C++的std :: string在非託管C++
- 23. 如何捕捉託管C++中的非託管C++異常
- 24. 圍繞本機C++圍繞C++/cli環繞c#/ WPF GUI
- 25. 調試MMC(非託管C++)?
- 26. 非託管C++ .NET中
- 27. 持續與非託管C++
- 28. 在非託管C++代碼
- 29. c#中的管理非託管變量
- 30. 非託管C++ COM和託管C++ .NET4互操作
COM是一個選項。它有一些古怪。好吧,好幾個。 –
@HansPassant:我第二個。特別是如果目標是綁定到VBA/Excel。 –