一般来说,参数类型错误会导致这种错,我的参数应该没问题的,直接贴代码吧
C++接口声明
XXX_API BOOL writeBufNodeData(XXX_FILE *pFile, long long filePos, int len, unsigned char *pBuf);
C#声明
[DllImport("XXX.dll", EntryPoint = "writeBufNodeData", CallingConvention = CallingConvention.Cdecl)] public static extern bool WriteBufNodeData(ref XXXStruct file, long filePos, int len, IntPtr bufferPtr);
[DllImport("XXX.dll", EntryPoint = "writeBufNodeData", CallingConvention = CallingConvention.Cdecl)] public static extern bool WriteBufNodeData(ref XXXStruct file, long filePos, int len, [In, Out][MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]byte[] buffer);
C#试了2种方式,第一种申请一块非托管内存传递,第二种是托管数组加上修饰,调用的时候均会出错
奇怪的是,我把C#程序生成了给C++开发进行调试没有问题,内存中的数据也是对的(我对比了传递之前和C++收到的数据),我这一调用就会出错,求大神解答
神奇的是,我在其他同事电脑上试也是正常的,就我这边出错,直接运行程C++ Dll序崩溃会有dmp文件,C++拿去看说是他拿到数据后找不到地方写导致崩溃。。。是我的电脑有问题吗
int writeBufNodeData(IntPtr pFile, int64 filePos, int len, IntPtr pBuf);
然后原来的 C++ API 有问题,pBuf 没有指定大小。
这个大小是由C#定的,然后C++读取 len 长度的数据
@ever_Young: 你是说 len 表示的是 pBuf 的长度吗?
@Launcher: 算是吧,C#传给C++,表示C#写了多少字节,然后C++也就读取相应数量的数据
@ever_Young: 算了,你这 API 定义的问题大了,你直接把 C++ 的实现代码贴出来吧。
@Launcher: 找到原因了,C++代码问题。。。也谢谢大神了:-)