很多前奏就不说了,为了利用以前c++可用模块,给c#调用,需要把c++模块封装成dll文件,由于c++和c#属于有着不同语言规范,会导致封装好的dll接口的参数类型映射到c#里面,这里常用到的主要int ,char * ,const char *(for c++) 一般不要用太高级的东西像标准模板库stl,或者复杂结构体,这里主要原因是微软封装的这套接口内部有个转化关系,具体什么规则,很多人都说的查手册,我对这个规则也不感兴趣,所以没有深入研究。如果你用,你会发现很多坑,最后都不知道怎么掉坑里的。
c++ 与c# 映射 大部分都可以查一下c#到c++映射, 这里主要说一下指针的东西,大家都知到c#没有指针概念,即使不知道也没关系,这里说一下字符串的相关指针,char * 如果传入不改变其值c#对应接口用String,如果修改其传入值用StringBuilder ,但是在C#需要定制STringBuilder的内存大小,因为这个东西进入到C++就没法在动态分配内存了,这个也好理解,本来就不在一个层面的东西,到了底层肯定不好使了,还有给一下StringBuilder的如何分配多大内存的东西,这就是我对c#比较厌恶的一点,用别人东西,都不知道因为什么,StringBuilder sb = new StringBuilder(new string('\0',256)) ,这里256就是相关大小,给个接口也能用成这样,对于搞c++实在不能忍,我估计很多人都不能忍。
其实说了这么多最重要的就是俩件事,
1. c++ char* 映射俩种类型 String 和StringBuilder
2. StringBuilder 可以传入c++ 并且可以修改
还有一件事就是返回值中不可以返回StringBuilder 可以返回String 但是返回的String会有些问题,这是本人做rsa加密的时候遇到的,也就是他会把一些空格特殊字符串翻译成不同的编码,会导致最后获取的字符串看起来一样,其实中间很多地方被修改了。
c#调用c++ dll 由于中间有一层翻译的东西,也就是虚拟机还是什么的,会导致一些奇诡的问题,最好在vs一个工程里面把c#和c++dll库放在一起调试配置,能快点,要不得累死。其实主要还是对返回的值或者字符串进行编码,看一下真正的内在东西,你会发现不一样的。