当前位置: 首页 > 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款电脑健康状况监测软件
  • 比起追逐爆款,动画行业更需要打开思路“重塑肉身”
  • 美方因涉港问题对中国官员滥施非法单边制裁,外交部:强烈谴责,对等反制
  • 2025年度“沪惠保”将于4月22日开售,保费不变
  • 竹子砍了地却种不上,贵州赤水被指“整改复耕”存形式主义
  • 路面突陷大坑致车毁人亡,家属称不知谁来管,长治当地回应
  • 世界读书日|全城书香,上海“全民阅读”正在进行时