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


            最近某个项目要采集交易终端的信息用于监管,主要厂商给出了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),对于数据在托管内存和非托管内存中的传递。图示如下:

    数据封送

  • 相关阅读:
    Java-Maven(三):Maven坐标、Maven仓库、Maven生命周期
    Java-Maven(二):Maven常用命令
    CF796C Bank Hacking题解
    米特运输——(dfs)
    lower_bound()和upper_bound()如果搜下标到头返回啥
    骑士https://vjudge.net/contest/364177#problem/Y——(基环树)
    CF1215DTicketGame——(博弈)
    #define xhxj (Xin Hang senior sister(学姐))
    The Meaningless Game 题解
    P2827 蚯蚓
  • 原文地址:https://www.cnblogs.com/ceachy/p/PInvoke.html
Copyright © 2020-2023  润新知