使用C++/CLI呼叫C#封裝類庫
小序:
用C#開發的庫,供C#開發人員呼叫,一切正常。客戶:你們的API得支援C++。對於C++小白的我來說,只能含淚惡補C++知識,並且準備使用C++來封裝介面的時候突然發現,C#端封裝的介面裡面使用了第三方的庫,C++裡面沒用對應的庫,欲哭無淚的我正準備放棄的時候,山窮水復疑無路,柳暗花明又一村,偶然發現的 C++/CLI完美解決了我的問題。
正文:
這裡不準備做C++/CLI的介紹,只是將使用過程中踩過的坑做記錄。
使用C++/CLI可以在C++中呼叫C#封裝的dll,在實際使用中,由於資料介面還是C#型別,需要做相應的轉換供C++人員使用。這裡推薦一款神器:C# to C++ Converter
地址: https://www.tangiblesoftwaresolutions.com/product_details/csharp_to_cplusplus_converter_details.ht
將c#物件轉換為c++物件,對於c++小白的我來說無外乎為天降猛男。
使用C++/CLI中遇到的最大的問題莫過於處理System.Object型別的資料,通過C# to C++ Converter 轉換為c++程式碼對應的型別為
void*,查閱資料如何實現void*指標與託管物件System.Object相互轉換,發現這條路走不通後。只好採取另外的方法,在c++中使用
byte陣列來替代void*,byte陣列很容易轉託管型別陣列array<byte>,通過Mashal::Copy方法即可實現轉換。剩下的問題為如何將
c++各種型別的資料轉換成byte陣列,經過一番摸索,發現藉助BitConverter可以很方便完成這一工作,無需面對各種<< >>位操作。
總結:
對於C#開發人員來說,C++/CLI很容易上手,C# to C++ Converter能夠快速幫助掌握對應C++程式碼,Marshal中包含了託管型別與非託管型別的轉換方法。C++/CLI 不足:不支援C# 5中的 async await 非同步方法,無法使用lambda表示式。不過想想,如果將C#特性全部移植過來的話不太可能,所以在設計的時候需要儘量規避掉這些特性。
相關文章
- C++庫封裝JNI介面——實現java呼叫c++C++封裝Java
- c#封裝DBHelper類C#封裝
- C/C++ Zlib庫封裝MyZip壓縮類C++封裝
- c# Lambda操作類封裝C#封裝
- C++動態庫封裝C#庫,驗證動態庫環境C++封裝C#
- C#呼叫C++動態連結庫C#C++
- C++呼叫C#的動態庫dllC++C#
- 靜態庫封裝之ComStr類封裝
- 靜態庫封裝之ComFile類封裝
- 靜態庫封裝之ComDir類封裝
- C#呼叫 C++的DLLC#C++
- 海康網路相機C#封裝庫分享C#封裝
- C# 使用特性的方式封裝報文C#封裝
- C++呼叫 c#生成的dllC++C#
- vue-cli 3.0 + 對 axios 封裝VueiOS封裝
- 用託管類庫的方式在C#中使用C++編寫的類(設計流程)C#C++
- php用curl封裝一個http請求類(鏈式呼叫)PHP封裝HTTP
- VS(visual studio) C++ 封裝dll,以及其隱式呼叫與顯式呼叫(靜態動態)C++封裝
- 萬能PHP Curl封裝類,適合多個場景,呼叫方便!PHP封裝
- C# 反射呼叫擴充類方法C#反射
- pdf417lib庫封裝和使用封裝
- ThinkPHP 使用命令列 (cli) think 呼叫PHP命令列
- 封裝Date工具類封裝
- 封裝Redis工具類封裝Redis
- C#呼叫js庫的方法C#JS
- java呼叫c++動態庫之jni呼叫JavaC++
- linux下使用boost.python呼叫c++動態庫LinuxPythonC++
- java動態呼叫c++庫JavaC++
- flutter中呼叫C++的庫FlutterC++
- jwt是什麼?php jwt類封裝和使用JWTPHP封裝
- aardio封裝庫) sunny抓包工具的使用封裝
- 使用Promise封裝fetch庫(增刪改查)Promise封裝
- toLua中Lua呼叫C#中的類C#
- C++ 使用 hiredis 封裝redis 的資料獲取介面C++Redis封裝
- 4、類和物件—封裝物件封裝
- 一、類的封裝性封裝
- 自用驗證類封裝封裝
- 在 vue-cli 3.0 + 裡面對 axios 封裝VueiOS封裝