使用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# SQLite資料庫 訪問封裝類C#SQLite資料庫封裝
- C++類 使用template 如何封裝為DLLC++封裝
- c# Lambda操作類封裝C#封裝
- C/C++ Zlib庫封裝MyZip壓縮類C++封裝
- C++動態庫封裝C#庫,驗證動態庫環境C++封裝C#
- C/C++封裝庫ocicpplib呼叫Oracle儲存過程的方法C++封裝Oracle儲存過程
- C#呼叫C++動態連結庫C#C++
- C++呼叫C#的動態庫dllC++C#
- 應用SWIG 封裝C++ 介面提供Java 程式呼叫封裝C++Java
- 13封裝網路請求類庫封裝
- 靜態庫封裝之ComStr類封裝
- 靜態庫封裝之ComFile類封裝
- 靜態庫封裝之ComDir類封裝
- 一個C#封裝的加密解密類程式碼C#封裝加密解密
- 基於MongoDb官方C#驅動封裝MongoDbCsharpHelper類(CRUD類)MongoDBC#封裝CSharp
- C#呼叫 C++的DLLC#C++
- android使用C/C++呼叫SO庫AndroidC++
- 海康網路相機C#封裝庫分享C#封裝
- C# 使用特性的方式封裝報文C#封裝
- 封裝xunsearch類封裝
- JS 封裝類JS封裝
- jquery 封裝的ajax呼叫jQuery封裝
- vue-cli 3.0 + 對 axios 封裝VueiOS封裝
- 初探資料庫通用程式碼庫的封裝(C#版)資料庫封裝C#
- php用curl封裝一個http請求類(鏈式呼叫)PHP封裝HTTP
- C++呼叫 c#生成的dllC++C#
- C++ 多個類的 DLL 封裝以及隱式連結和顯式連結 2 種方法呼叫C++封裝
- C++ 封裝互斥物件C++封裝物件
- jsp呼叫javabean封裝資料庫的問題,急!JSJavaBean封裝資料庫
- jsp呼叫javabean,javabean封裝資料庫的問題JSJavaBean封裝資料庫
- 用託管類庫的方式在C#中使用C++編寫的類(設計流程)C#C++
- 封裝Date工具類封裝
- JsonValue 封裝類JSON封裝
- 封裝Redis工具類封裝Redis
- ThinkPHP 使用命令列 (cli) think 呼叫PHP命令列
- 萬能PHP Curl封裝類,適合多個場景,呼叫方便!PHP封裝