日期:2014-05-18  浏览次数:21197 次

C#调用c++的dll文件,内存错误

RT,总是出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
C/C++ code

API_API    DWORD data_msg(char* buf,DWORD size){}


我在C#中调用
C# code

[DllImport("API.dll")]
public static extern int data_msg(StringBuilder pdata, int size);//调用这个函数,每隔一段时间后都会出现内存已损坏


请问如何解决,谢谢

------解决方案--------------------
要确保StringBuilder的内部缓冲区(容量)足够大。如size用于指示缓冲区大小,或可这样:
StringBuilder sbBuffer = new StringBuilder(260);
...
int iResult = data_msg(sbBuffer, sbBuffer.Capacity);

如果还不行,就可能是C++ Dll其本身有问题
------解决方案--------------------
byte[]
------解决方案--------------------
探讨
byte[]

------解决方案--------------------
不要用StringBuilder,用String就可以了。
char*对应于String,StringBuilder是复杂的字符串处理类不等效于char*,其实例的内存中的内容比char*中指向的字符串要多的多,内存格式都不一样,当然会报错了。
你可以试试调用StringBuilder的ToString(Int32, Int32) 方法,
data_msg(sbBuffer.ToString(0,sbBuffer.Length), sbBuffer.Length);

------解决方案--------------------
如果可以的话 接口修改成
DWORD data_msg(wchar_t* buf,DWORD size){}
c# 用unicode 字符集调用这个接口方法


------解决方案--------------------
另外在msdn里头可以查找P/Invoke, dllimport的相关文章,有很多例子。在vs的安装目录,sample目录里头找Pinvoke目录,也有代码例子。