C#调用C++的Dll出现异常:尝试访问受保护的内存

 

在遇到这个问题时我搜了很多资料,针对这种异常信息的代码各式各样。也就是说在此这并不是唯一的解决方案,仅供参考,若是跟以下场景相符那就可以试试这种解决方案。

 

场景:

使用C#调用固高提供的gts类中的方法:

[DllImport("gts.dll")]
public static extern short GT_GetCrdPos(short cardNum,short crd,out double pPos);

固高官方文档对此方法的解释:

很显然pPos参数是一个指针,它的解释为:该参数为一个数组首元素的指针,数组的元素个数取决于该坐标系的维数。这么一说pPos可以是一个数组,因此需要修改gts类的这个方法为以下形式:

[DllImport("gts.dll")]
public static extern short GT_GetCrdPos(short cardNum,short crd,out double[] pPos);

然后进行调用,异常就出来了:尝试访问受保护的内存。

我还试了在C#里面定义一个指针传指针进去,然后方法的形式改成(double上加了 * 号表指针):

[DllImport("gts.dll")]
public static extern short GT_GetCrdPos(short cardNum,short crd,out double* pPos);

结果方法是调起了,担当访问这个指针时还是报:尝试访问受保护的内存。

最后的解决方案:

前后看了几遍C++源码,最后把out关键字去掉才行,如下形式:

[DllImport("gts.dll")]
public static extern short GT_GetCrdPos(short cardNum,short crd,double[] pPos);

那么,out对参数到底做了什么??网上有资料:out只进不出,ref可进可出。那么对于指针它更像是可进可出的,在面向对象中传对象就是传地址值,也就相当于传引用。这样,使用 ref和直接传对象更符合指针的要求(仅猜测 !)

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值