RT,总是出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”API_API DWORD data_msg(char* buf,DWORD size){}我在C#中调用[DllImport("API.dll")]
public static extern int data_msg(StringBuilder pdata, int size);//调用这个函数,每隔一段时间后都会出现内存已损坏请问如何解决,谢谢

解决方案 »

  1.   

    要确保StringBuilder的内部缓冲区(容量)足够大。如size用于指示缓冲区大小,或可这样:
    StringBuilder sbBuffer = new StringBuilder(260);
    ...
    int iResult = data_msg(sbBuffer, sbBuffer.Capacity);如果还不行,就可能是C++ Dll其本身有问题
      

  2.   

    恩恩,谢谢,我之前定义的size是140,不知道是不是容量不够大,先去试试
      

  3.   

    如果是char* 改为byte[]的话也试过了,依然会有问题
      

  4.   

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

  5.   


    补充:
    函数原型定义修改:
    [DllImport("API.dll")]
    public static extern int data_msg(String pdata, int size);
      

  6.   

    上面的修改写错了,重新:
    [DllImport("API.dll")]
    public static extern int data_msg(string pdata, int size);
      

  7.   

    谢谢,string试过了,出不出错先不说,我调用的dll用string取不到数据,基本上是好多种类型都试过,只有stringbuilder是有数据
      

  8.   

    如果用string传不进数据的话那么下面的定义中的buf不是一个char*,可能是一个struct什么的。
    API_API    DWORD data_msg(char* buf,DWORD size){}char* buf在c#内的标准对应就是string。
      

  9.   

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

  10.   

    恩  谢谢,网上查找C++与C#匹配类型中,stringbuilder与char*匹配
      

  11.   

    谢谢,引用的是别人写的dll,没法修改
      

  12.   

    你说的也没错,也有说是string,但是我使用string没办法找到数据,所以就判断是stringbuilder
      

  13.   

    在dllimport属性里头,指定charset=ansi.默认系统时用unicode的
      

  14.   

    对于char*,就能用byte[]和stringbuilder,没有其他选择
      

  15.   

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

  16.   

    谢谢,不过问题依然存在,试了很多种情况,都会出现内存问题,所以决定从C++的dll着手,只能让我们公司懂C++的看看了
      

  17.   

    看你的C导出接口,没有使用extern "C",导出的函数名称就会有变化,不在是data_msg,这个你需要制定dllimport属性中的一个导入名称的熟悉。你可以使用Depneds.exe查看导出的函数真正名称。