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

关于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

更多相关:

  • 这里将分享我使用PCL库的遇到的一些坑,以及总结的技巧,当然也需要各位能够多多分享,将公众号的文章或者知识星球的文章转发到朋友圈。 pcl_common中主要是包含了PCL库常用的公共数据结构和方法,比如PointCloud的类和许多用于表示点,曲面,法向量,特征描述等点的类型,用于计算距离,均值以及协方差,角度转换以及几何变化的函...

  • C++中extern是指全局的意思。它一般有两个方面的用途: 1、声明变量 首先说一下声明和定义的区别: ①变量的定义:用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。 ②变量的声明:用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern...

  • 在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A {     int i;     B b; } class B {     int i;     A* a; } 请注意上面的定义内容,一般情况下是不能出现类A,类B相互引用都定义对象,即...

  •   前天在玩OLED时想完成一直想弄得一个东西,就是简单的单片机游戏。因为STM32和nRF51822的内存足够,所以就用缓存数组的方法来显示图像(我也不知道术语是啥,反正就是在内存中建立一个128X64的二维数组,更新显示时将整个数组刷新到屏幕上),而且这两个OLED是串口的(还有一个128X32的OLED,一样串口的,连驱动时序和...

  • 三、继承中容易引起的错误有时候继承也会带来些错误,比如说下面这条css定义: body{color:blue} 在有些浏览器中这句定义会使除表格之外的文本变成蓝色。从技术上来说,这是不正确的,但是它确实存在。所以我们经常需要借助于某些技巧,比如将css定义成这样: body,table,th,td{color:blue} 这样表格...