C#调用c++的dll文件,内存错误 RT,总是出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”API_API DWORD data_msg(char* buf,DWORD size){}我在C#中调用[DllImport("API.dll")]public static extern int data_msg(StringBuilder pdata, int size);//调用这个函数,每隔一段时间后都会出现内存已损坏请问如何解决,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要确保StringBuilder的内部缓冲区(容量)足够大。如size用于指示缓冲区大小,或可这样:StringBuilder sbBuffer = new StringBuilder(260);...int iResult = data_msg(sbBuffer, sbBuffer.Capacity);如果还不行,就可能是C++ Dll其本身有问题 恩恩,谢谢,我之前定义的size是140,不知道是不是容量不够大,先去试试 如果是char* 改为byte[]的话也试过了,依然会有问题 不要用StringBuilder,用String就可以了。char*对应于String,StringBuilder是复杂的字符串处理类不等效于char*,其实例的内存中的内容比char*中指向的字符串要多的多,内存格式都不一样,当然会报错了。你可以试试调用StringBuilder的ToString(Int32, Int32) 方法,data_msg(sbBuffer.ToString(0,sbBuffer.Length), sbBuffer.Length); 补充:函数原型定义修改:[DllImport("API.dll")]public static extern int data_msg(String pdata, int size); 上面的修改写错了,重新:[DllImport("API.dll")]public static extern int data_msg(string pdata, int size); 谢谢,string试过了,出不出错先不说,我调用的dll用string取不到数据,基本上是好多种类型都试过,只有stringbuilder是有数据 如果用string传不进数据的话那么下面的定义中的buf不是一个char*,可能是一个struct什么的。API_API DWORD data_msg(char* buf,DWORD size){}char* buf在c#内的标准对应就是string。 如果可以的话 接口修改成DWORD data_msg(wchar_t* buf,DWORD size){}c# 用unicode 字符集调用这个接口方法 恩 谢谢,网上查找C++与C#匹配类型中,stringbuilder与char*匹配 谢谢,引用的是别人写的dll,没法修改 你说的也没错,也有说是string,但是我使用string没办法找到数据,所以就判断是stringbuilder 在dllimport属性里头,指定charset=ansi.默认系统时用unicode的 对于char*,就能用byte[]和stringbuilder,没有其他选择 另外在msdn里头可以查找P/Invoke, dllimport的相关文章,有很多例子。在vs的安装目录,sample目录里头找Pinvoke目录,也有代码例子。 谢谢,不过问题依然存在,试了很多种情况,都会出现内存问题,所以决定从C++的dll着手,只能让我们公司懂C++的看看了 看你的C导出接口,没有使用extern "C",导出的函数名称就会有变化,不在是data_msg,这个你需要制定dllimport属性中的一个导入名称的熟悉。你可以使用Depneds.exe查看导出的函数真正名称。 winfrom 文件和文件夹的选定 winform下双击listview事件 SQL 使用TransactionScope时出现“与基础事务管理器的通信失败”的错误 如何实现windows系统任务栏效果? 错在何处~~?? 真的找不出来 vs.net2005Express是不是还没有中文版可以下? 求救~~DataGrid中如何用js找到指定控件 一个关于二维数组绑定到DataGrid上的问题(windows窗口下),急!!! 寻问C#视频教程 用Winform实现jpg,gif图片的播放,以及实现ppt的播放功能? 串口接收事件后Invoke问题
StringBuilder sbBuffer = new StringBuilder(260);
...
int iResult = data_msg(sbBuffer, sbBuffer.Capacity);如果还不行,就可能是C++ Dll其本身有问题
char*对应于String,StringBuilder是复杂的字符串处理类不等效于char*,其实例的内存中的内容比char*中指向的字符串要多的多,内存格式都不一样,当然会报错了。
你可以试试调用StringBuilder的ToString(Int32, Int32) 方法,
data_msg(sbBuffer.ToString(0,sbBuffer.Length), sbBuffer.Length);
补充:
函数原型定义修改:
[DllImport("API.dll")]
public static extern int data_msg(String pdata, int size);
[DllImport("API.dll")]
public static extern int data_msg(string pdata, int size);
API_API DWORD data_msg(char* buf,DWORD size){}char* buf在c#内的标准对应就是string。
DWORD data_msg(wchar_t* buf,DWORD size){}
c# 用unicode 字符集调用这个接口方法