c# 调用c++ dll,尝试读取或写入受保护的内存。这通常指示其他内存已损坏

c++代码:HYPOCENTERLOCATE_APIdouble*hypocenterLocate(doubleinformationofsensor[][5],doub... c++代码:
HYPOCENTERLOCATE_API double * hypocenterLocate(double informationofsensor[][5],double X_initial[],int m_numSen,double Vp,double Vs,int m_np)
{
double result[4]={0};
。。。计算过程。。。。
return result;

}
C#代码:
[DllImport("hypocenterLocate", EntryPoint = "hypocenterLocate", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr hypocenterLocate(IntPtr informationofsensor, IntPtr X_initial, int m_numSen, double Vp, double Vs,int m_np);
double[] a = new doulbe[4];
Marshal.Copy(hypocenterLocate(gch.AddrOfPinnedObject(), gch2.AddrOfPinnedObject(), senNum, Vp, Vs, m_np_xiashan), a, 0, 4);

在VS中调用的时候偶尔会报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误,但大部分时候都能运行。
但是在bin文件夹下直接打开exe文件,程序直接崩溃。请问是怎么回事?
展开
 我来答
仙戈雅3n
推荐于2016-04-12 · TA获得超过5790个赞
知道大有可为答主
回答量:2398
采纳率:75%
帮助的人:885万
展开全部

托管代码调用非托管时加上这句:

[StructLayout(LayoutKind.Sequential,Pack=1)] 
另外你要使用句柄平台的特定类型IntPtr来接受它回返的值,用上下文可知它返回的是一个double型的指针值的函数。
追问
Marshal.Copy(hypocenterLocate(gch.AddrOfPinnedObject(), gch2.AddrOfPinnedObject(), senNum, Vp, Vs, m_np_xiashan), a, 0, 4);

这句是调用的过程,要把[StructLayout(LayoutKind.Sequential,Pack=1)] 加在哪里呢
追答
加在声明部分的上方。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式