小序:
用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#特性全部移植过来的话不太可能,所以在设计的时候需要尽量规避掉这些特性。