ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-06-02 20:53:36  阅读:195  来源: 互联网

标签:调用 Invoke C# StringBuilder 平台 C++ API 初心


最近某个项目要采集交易终端的信息用于监管,主要厂商给出了API,C++版的。。。开启hard模式!!!

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,
免费送C++的视频教程噢!
我每晚上8点还会在群内直播讲解C/C++知识,欢迎大家前来学习哦。

 

标签:调用,Invoke,C#,StringBuilder,平台,C++,API,初心
来源: https://blog.csdn.net/XZQ121963/article/details/90742570

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有