[DllImport("__BANKER.dll", EntryPoint = "getdata", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern double getdata(StringBuilder sb, int nLen);这是c写的dll代码声明extern "C" __declspec(dllexport) double zhuang(char *array,int N);
结果:
“尝试读取或写入受保护的内存,这通常表明其他内存已损坏。”
网上搜索很多是类型的问题,之前C#用的是char[],出问题,现在改成string ,stringbuilder还是这样。

解决方案 »

  1.   

    public static extern double getdata(byte[] sb, int nLen);byte[] sb = System.Text.Encoding.Default.GetBytes(字符串);
    nLen = sb.Count();
      

  2.   

    EntryPoint = "getdata"
    =>
    EntryPoint = "zhuang"
      

  3.   

    EntryPoint = "getdata",可以使用depend工具看对应名称是什么就写什么,至于你这边的方法命名可以随你便。有一点要注意,方法的参数类型和顺序有一定的规定,需要你自己测试。
      

  4.   

       [DllImport("__BANKER.dll", EntryPoint = "getdata", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
            public static extern double getdata(  [MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)] string sb, int nLen); UnmanagedType.ByValTStr是把托管代码转化为非托管代码的数组,SizeConst是数组长度。你可以这样试试
      

  5.   

    dll是我自己写的,就是用的char *