高级语言调用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);}