关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑

因客户需求,与第三方对接,调用非托管DLL,之前正常对接的程序,却总是报“内存已损坏的异常”,程序进程直接死掉,折腾到这个点(2018-05-11 00:26),终于尘埃落定,直接上程序。

之前的程序:

                //定义入参
                StringBuilder strin = new StringBuilder();
                //定义回应
                StringBuilder strout = new StringBuilder();
                strin.Append(softPosStrin.CheckOutID.PadRight(10, ' '));
                strin.Append(softPosStrin.OperatorID.PadRight(10, ' '));
                strin.Append(softPosStrin.TransType);
                strin.Append(softPosStrin.Money.PadLeft(12, '0'));
                strin.Append(softPosStrin.PayType);
                strin.Append(softPosStrin.ReverseID);
                //调用
                CreditTrans(strin.ToString(), strout);    

优化后的程序:

          //定义入参
                StringBuilder strin = new StringBuilder(1024);
                //定义回应
                StringBuilder strout = new StringBuilder(1024);
                strin.Append(softPosStrin.CheckOutID.PadRight(10, ' '));
                strin.Append(softPosStrin.OperatorID.PadRight(10, ' '));
                strin.Append(softPosStrin.TransType);
                strin.Append(softPosStrin.Money.PadLeft(12, '0'));
                strin.Append(softPosStrin.PayType);
                strin.Append(softPosStrin.ReverseID);
                //调用
                CreditTrans(strin.ToString(), strout);   

StringBuilder指定了大小后,在运行效率上会高很多,这个是一个方面。另外一个方面,当调用Win32的DLL时,如果接口方法的参数中有字符串的输出(LPSTR),就应该使用StringBuilder这个类型,
此时,定义的StringBuilder变量就必须指定大小(为变量初始化内存空间),否则,当DLL内部对变量空间赋值的时候会失败,甚至出现意外,因为外部DLL并不支持StringBuilder这样的数据操作行为

转载于:https://www.cnblogs.com/zix1314/p/9022557.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值