当前位置: 首页 > news >正文

高级语言调用C接口(二)回调函数(3)C#

原接口定义请参照高级语言调用C接口(二)回调函数(2)

我们直接来看C#的接口定义

        [DllImport("XXX.dll")]public static extern IntPtr Init(string pcPayDeviceIP, int usTlsPort, OnPayResult onPayResult);

委托定义

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]public delegate void OnPayResult(IntPtr pstPayResult);

委托绑定接口及调用

OnPayResult onPayResult += new OnPayResult(OnPayResult);
Init(pcPayDeviceIP, usTlsPort, onPayResult);

接口定义

        protected abstract void PayResult(PayResult payResult);private void OnPayResult(IntPtr pstPayResult){PayResultTmp st = (PayResultTmp)Marshal.PtrToStructure(pstPayResult, typeof(PayResultTmp));PayResult payResult = new PayResult();payResult.place = enPlace.SD_D_PLACE_BUTT;payResult.place = (enPlace)Marshal.ReadInt32(pstPayResult);payResult.errCode = PtrToUtf8String(st.errCode);payResult.errInfo = PtrToUtf8String(st.errInfo);payResult.seqId = PtrToUtf8String(st.seqId);payResult.merOrderId = PtrToUtf8String(st.merOrderId);payResult.srcReserve = PtrToUtf8String(st.srcReserve);payResult.attachedData = PtrToUtf8String(st.attachedData);payResult.totalAmount = PtrToUtf8String(st.totalAmount);payResult.couponAmount = PtrToUtf8String(st.couponAmount);payResult.payAmount = PtrToUtf8String(st.payAmount);payResult.payTime = PtrToUtf8String(st.payTime);payResult.orderCreateTime = PtrToUtf8String(st.orderCreateTime);payResult.status = PtrToUtf8String(st.status);PayResult(payResult);}

由于回调传过来的C申请的内存,结构与C#不一致,必须通过Marshal进行转换,否则会出现内存访问异常。

结构体定义

        [StructLayout(LayoutKind.Sequential)]private struct PayResultTmp{public enPlace place; //收单机构public IntPtr errCode; //错误码public IntPtr errInfo; //错误信息public IntPtr seqId; //平台流水号public IntPtr merOrderId; //商户订单号public IntPtr srcReserve; //请求系统预留字段public IntPtr attachedData; //商户附加数据public IntPtr totalAmount; //订单金额public IntPtr couponAmount; //优惠金额public IntPtr payAmount; //实付金额public IntPtr payTime; //支付时间public IntPtr orderCreateTime; //订单创建时间public IntPtr status; //交易状态}[StructLayout(LayoutKind.Sequential)]public struct PayResult{public enPlace place; //收单机构public string errCode; //错误码public string errInfo; //错误信息public string seqId; //平台流水号public string merOrderId; //商户订单号public string srcReserve; //请求系统预留字段public string attachedData; //商户附加数据public string totalAmount; //订单金额public string couponAmount; //优惠金额public string payAmount; //实付金额public string payTime; //支付时间public string orderCreateTime; //订单创建时间public string status; //交易状态}

实现、通过继承抽象类,重写抽象接口实现回调的具体逻辑

        protected override void PayResult(PayResult payResult){Console.WriteLine("errCode:{0}, errInfo:{1}", payResult.errCode, payResult.errInfo);}

相关文章:

  • 智慧生态评估体系构建与三维可视化实践——基于多源数据融合的内蒙古风电场生态效应研究
  • 杰理10k3950温度测量
  • 3.数组(随想录)
  • C语言学习之sizeof函数和strlen函数
  • 【Code】《代码整洁之道》笔记-Chapter17-味道与启发
  • 云服务器和物理服务器有什么区别
  • 2025年3月,再上中科院1区TOP,“等级熵+状态识别、故障诊断”
  • 制作一款打飞机游戏教程6:射击优化
  • 【嵌入式八股5】C++:多线程相关
  • Python基础语法——注释和输入输出
  • Go 语言的 map 在解决哈希冲突时,主要使用了链地址法同时参考了开放地址法的思想即每个桶的 8个 key val对是连续的
  • 如何利用游戏盾提升在线游戏的安全性?
  • 2025 年蓝桥杯 Java B 组真题解析分享
  • 大模型平台Dify工作流高效调用Ragflow知识库,解决其原生知识库解析和检索能力不足的问题
  • 基于ssm的航空售票系统
  • by组态适用领域
  • Shell编程之函数与数组
  • 临床协调简历模板
  • python——学生管理系统
  • 5款电脑健康状况监测软件
  • 庄语乐︱宋代历史是被“塑造”出来的吗?
  • 南京航空航天大学启动扁平化改革:管理岗规模控制在20%,不再统一设科级机构
  • 人社部:一季度全国城镇新增就业308万人,同比增加5万人
  • 外交部:欢迎外国朋友“五一”来中国
  • 报告显示2024年全球军费开支增幅达冷战后最大
  • 美情报机构攻击中国大型商用密码产品提供商,调查报告公布