在遇到这个问题时我搜了很多资料,针对这种异常信息的代码各式各样。也就是说在此这并不是唯一的解决方案,仅供参考,若是跟以下场景相符那就可以试试这种解决方案。
场景:
使用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和直接传对象更符合指针的要求(仅猜测 !)