//调用C的dll函数,函数前两个参数为入参,第三个为出参
[DllImport("NhImp.dll", EntryPoint = "getMembers", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern int getMembers(ref string nd, ref string ylzh, StringBuilder members);//调用
string nd = "2012";
            string ylzh = "1412010103000029";
            StringBuilder YBOutBuf = new StringBuilder(10240);
            int retint = getNhMembers(ref nd, ref ylzh, YBOutBuf);一执行int retint = getNhMembers(ref nd, ref ylzh, YBOutBuf); 就报内存损坏错误,那位大侠指点下啊,谢谢!

解决方案 »

  1.   

    ref string nd, ref string ylzh
    两个 ref 去掉试试
      

  2.   

    另外原函数有 _stdcall 的修饰吗?
      

  3.   

     有可能是参数类型问题。。  int retint = getNhMembers(ref nd, ref ylzh, YBOutBuf) 按照你上面写的返回的参数肯定不是INT类型 能否调试 看看异常错误是什么
     
      

  4.   

    函数返回值是int ,用C++ 调用是可以正常的。那三个参数 原型都是char* ,C#里面调用的参数 带不带ref的string,还有StringBuilder 我都试过了,都是内存损坏,还有一个奇怪的问题,就是我用C++写的dll 调这个第三方的dll,然后用C++的exe来调我的C++的dll就可以的,我用C#调我的C++的dll,如果C++的dll里面不调第三方的dll,就没问题,可以成功,一旦调了第三方的dll,就是内存损坏的问题,而且我把调第三方的dll的参数全部在C++dll里面重新定义的,和C#传的无关系。很是郁闷,这个问题太奇怪了。
      

  5.   

    StringBuilder对应char*,string对应const char*
      

  6.   

    string  和 StringBuilder 都试过了 不行,用byte[]  的 不知道写得对不对  也是提示 内存损坏。
      

  7.   

    1、函数原型晒出来看看
    2、不能简单把传出的char*就用StringBuilder
      

  8.   

    就比方说假如是:int getMembers(char* s1,char* s2,char** s3)
    P/Invoke助手生成的是
        [System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="getMembers")]
    public static extern  int getMembers(System.IntPtr s1, System.IntPtr s2, ref System.IntPtr s3) ;
      

  9.   

    你的C++的dll调用这个第三方dll的代码能贴出来看看么?
      

  10.   

    System.IntPtr   能存字符串吗?我没有用过这个类型
      

  11.   

    System.IntPtr 和String 不是对应的
      

  12.   


    那个代码就是 加载他的dll  找到函数指针,给函数传了三个指针。第三个char* members = new char[10240];
      

  13.   

    [DllImport("NhImp.dll", EntryPoint = "getMembers")]
    private static extern int getMembers(IntPtr s1, IntPtr s2, IntPtr s3);private static IntPtr InStr(string str)
    {
        byte[] arr = new byte[str.Length * 2];
        Encoding.ASCII.GetBytes(str, 0, str.Length, arr, 0);
        IntPtr p = Marshal.AllocHGlobal(arr.Length);
        Marshal.Copy(arr, 0, p, arr.Length);
        return p;
    }static void Main()
    {
        string nd = "...";
        string ylzh = "...";    IntPtr s1 = InStr(nd);
        IntPtr s2 = InStr(ylzh);
        IntPtr s3 = Marshal.AllocHGlobal(10240);    getMembers(s1, s2, s3);    string members = Marshal.PtrToStringAnsi(s3);    Marshal.FreeHGlobal(s1);
        Marshal.FreeHGlobal(s2);
        Marshal.FreeHGlobal(s3);
    }这样试试
      

  14.   

    函数原型啊
    getMembers的函数原型贴出来
      

  15.   

    谢谢各位  问题解决了,是在这个函数之前调了别的函数,那个函数的入参用了ref,把那个函数的入参的ref去掉就可以了。郁闷啊!