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文件,程序直接崩溃。请问是怎么回事? 展开
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文件,程序直接崩溃。请问是怎么回事? 展开
1个回答
展开全部
托管代码调用非托管时加上这句:
[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)] 加在哪里呢
追答
加在声明部分的上方。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询