读书人

C#调用c++的dll文件内存异常

发布时间: 2012-03-26 15:46:55 作者: rapoo

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目录,也有代码例子。

读书人网 >C#

热点推荐