问题描述
C#调用其他语言DLL库,提示尝试读取或写入受保护的内存。这通常指示其他内存已损坏代码如下==========================================DLL函数int__stdcallActionReceived(constchar*devId,constint*windowId,constchar*cmd,char*data)==========================================C#调用[DllImport(@"Caller.dll",CallingConvention=CallingConvention.StdCall)]publicstaticexternintActionReceived(StringdevId,refintwindowId,Stringcmd,StringBuilderdata);intk=1;StringBuilderbuilder=newStringBuilder(256);inta=ActionReceived("test",refk,"call",builder);
解决方案
解决方案二:
这通常都是参数类型不匹配引起的
解决方案三:
因为dll里使用了指针如果参数类型不匹配,传入的数据就会造成指针越界,访问不可读写的内存
解决方案四:
引用2楼Z65443344的回复:
因为dll里使用了指针如果参数类型不匹配,传入的数据就会造成指针越界,访问不可读写的内存
请问现在要怎么改呢?我现在一点头绪也没有
解决方案五:
将Char*类型的全部定义成StringBuilder试试看...
解决方案六:
引用4楼u012804018的回复:
将Char*类型的全部定义成StringBuilder试试看...
还是报错
解决方案七:
封送的数据类型与目标不匹配publicstaticexternintActionReceived([MarshalAs(UnmanagedType.LPStr)]StringdevId,intwindowId,[MarshalAs(UnmanagedType.LPStr)]Stringcmd,[MarshalAs(UnmanagedType.LPStr)]StringBuilderdata);上面假设你的dll编译时采用的多字节字符集ANSI编译的如果采用的是宽字节(Unicode)编译,就改成[MarshalAs(UnmanagedType.LPWStr)]
解决方案八:
引用6楼dongxinxi的回复:
封送的数据类型与目标不匹配publicstaticexternintActionReceived([MarshalAs(UnmanagedType.LPStr)]StringdevId,intwindowId,[MarshalAs(UnmanagedType.LPStr)]Stringcmd,[MarshalAs(UnmanagedType.LPStr)]StringBuilderdata);上面假设你的dll编译时采用的多字节字符集ANSI编译的如果采用的是宽字节(Unicode)编译,就改成[MarshalAs(UnmanagedType.LPWStr)]
也不行
解决方案九:
最后一个参数,你好像不知道是怎么返回的。你先确定一下,C语言是如何成功调用的。
解决方案十:
引用8楼Saleayas的回复:
最后一个参数,你好像不知道是怎么返回的。你先确定一下,C语言是如何成功调用的。
因为我用的的厂房给的动态库,只有给的参数说明表,其他都没有
解决方案十一:
int__stdcallActionReceived(constchar*devId,constint*windowId,constchar*cmd,char*data)你知道最后一个参数,作为缓冲区,她期望的大小吗?
解决方案十二:
试试:[System.Runtime.InteropServices.DllImportAttribute("Caller.dll",EntryPoint="ActionReceived",CallingConvention=System.Runtime.InteropServices.CallingConvention.StdCall)]publicstaticexternintActionReceived([System.Runtime.InteropServices.InAttribute()][System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]stringdevId,refintwindowId,[System.Runtime.InteropServices.InAttribute()][System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]stringcmd,System.IntPtrdata);
解决方案十三:
如果不是最后一个参数的问题,可能就是intconst*windowId的问题。这更加像一个传入数组。