C#高阶与初心:(二)P/Invoke平台调用

C#调用C++的DLL基本就两种方法:加一个VC++项目包一层,或者使用P/Invoke(平台调用)。前者对于纯C#的客户端来说,增加了复杂性。那就只剩下平台调用了。使用平台调用的过程比较艰辛,主要遇到了两个问题:1、调用方式CallingConvention;2、参数类型;

调用方式默认貌似StdCall,如果调用Windows API,可以不写;但是对于C风格的,呵呵,得写成Cdecl。如果没写的话 ,内心肯定是崩溃的。。。为什么结果总是不对!!!

好日子过久了,就吃不了苦啦。。。在.Net框架下,基础数据类型的使用随手拈来,从来不会发生不知道怎么用的情况:数字就int,字符串就string,考究一点考虑考虑long和StringBuilder。一弄平台调用,傻眼了,这该用啥数据类型呢?!

函数的原型是GetSystemInfo(char* pSystemInfo, int& nLen),后一个参数知道是要传入一个ref int,前一个呢?同事告诉我可以使用string,但是问题是,需要传出([Out]),字符串都是不可更改的。谷歌一下,有说可以StringBuilder的,试试貌似好使(后来看到Learning Hard以及微软自己的文档,StringBuilder确实可以)。

但又遇到了问题——其中一家的API取出的字符串比len更长的部分是乱码(后来想其实可以截断)?!我司一位C++大佬给了条明路,可以使用byte[],试试,中!这才落定。

后来看了很多博客和微软的文档,数据封送(支持平台调用和COM)是一门技术,光说明都很多页。主要的内容是数据封送拆收器(Marshaler),对于数据在托管内存和非托管内存中的传递。图示如下:

如果有想学习c++的程序员,可来我们的C/C++学习扣qun:589348389,

微信公众号:java大世界(现在是发布c++学习干货哦,没有java)

免费送C++的视频教程噢!

我每晚上8点还会在群内直播讲解C/C++知识,欢迎大家前来学习哦。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近某个项目要采集交易终端的信息用于监管,主要厂商给出了API,C++版的。。。开启hard模式!!! C#调用C...
    编程小世界阅读 575评论 0 0
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,404评论 0 4
  • 《Java从小白到大牛》纸质版已经上架了!!! 由字符组成的一串字符序列,称为“字符串”,在前面的章节中也多次用到...
    tony关东升阅读 843评论 0 2
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,391评论 0 2
  • 火,就最先是被阿小辉给点起来的! 眼看九点,初中三节晚自习也该结束了,可阿小辉自5:10放学后就坐书桌前...
    多嬲阅读 190评论 0 1