使用C++/CLI呼叫C#封裝類庫

不負菁華發表於2020-09-29

小序:

用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#特性全部移植過來的話不太可能,所以在設計的時候需要儘量規避掉這些特性。

相關文章