最近做的项目,外壳是用C#写的,核心代码使用C++写的。在C#调用C++的DLL的过程中发现了以下的错误:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
    以下是C++的函数实现:
#pragma comment(linker, "/SECTION:MYSEC,RWS")   #pragma data_seg("MYSEC") char ResultBuffer[10000];  //ResultBuffer 是共享数据段中的一个char型数组,用来实现跨进程通信的#pragma data_seg() 
extern "C" __declspec(dllexport) char* GetRecordInfo()
{
    OutputDebugStringA(ResultBuffer);
    return ResultBuffer;
}C#下函数声明如下:
        [DllImport("HooksLib.dll")]
        public static extern StringBuilder GetRecordInfo();调用时,可以在DbgView中看到 ResultBuffer的值是正确的,但是在C#的代码中发生了尝试读取或写入受保护的内存。这通常指示其他内存已损坏的错误。
原来猜想是C#和C++中Char长度不一样,C#占两个字节,C++一个字节的问题,但是把Char转成了wchar_t也还是错。
花了两天时间,没能解决问题。希望有哪位高手,指导下。

解决方案 »

  1.   

    你应该庆幸没通过, C/C#共享一片内存是一个很不好的方法.=======================================================
    FreeLaxy, your backup.
    =======================================================
      

  2.   

    StringBuilder 修改成 IntPtr
      

  3.   

        哦,能请freelaxy解释下,C#和C++共享同一片内存会有哪些不好的影响么?
      

  4.   

        StringBuilder 修改成 IntPtr的确不会出现尝试读取或写入受保护的内存的错误,但是我该怎么在C#中从IntPtr获得string型的数据呢?,能请lazy_2010说明下么,小弟不太明白。
      

  5.   

    如何从IntPtr获得string值已经搞定了,使用 Marshal.PtrToStringAnsi可以获得string值,谢谢lazy_2010的指点。