这个问题比较诡异,我在网上搜了很久都没找到答案,
C#调用DELPHI写的DLL,调用其中一个方法:
        public static string 显示柜台返回信息()
        {                StringBuilder pDataBack = new StringBuilder();
                pDataBack.Capacity = 300000;
                readAnswer(ThreadNo, UniNumber, dwCommObj, ref pDataBack);
                string temp = pDataBack.ToString();                return temp;
            
        }其中 readAnswer(ThreadNo, UniNumber, dwCommObj, ref pDataBack);
是调用delphi编写的DLL文件里的接口,其中 pDataBack 是在调用之后回写的参数,也就是说在DLL里会对该参数重新赋值,现在问题是,如果赋值的字符比较小,则正常通过,如果赋值的内容过多,则会报错,如下:
未处理的异常:  System.AccessViolationException: 尝试读取或写入受保护的内存。这通
常指示其他内存已损坏。
   在 SingleFunctionBetter.ReadAnswer.Invoke(Int32 ThreadNo, Int32 UniNumber, In
t32 dwCommObj, StringBuilder& pDataBack)
   在 SingleFunctionBetter.Fixture.显示柜台返回信息() 位置 C:\guangda\test\Fixtu
re.cs:行号 111
   在 SingleFunctionBetter.Fixture.Main(String[] args) 位置 C:\guangda\test\Fixt
ure.cs:行号 249
请按任意键继续. . .我把 ref 改成 out也不行,我给pDataBack设置容量 pDataBack.Capacity = 300000;也不行,返回字符肯定小于3万
实在没招了~,在此发帖给大家,希望帮我解决一下,感激不尽~!

解决方案 »

  1.   


    DELPHI中函数的原型是:
    函数原型:function  ReadAnswer (ThreadNo: integer; UniNumber: integer; dwCommObj:  DWORD; var pDataBack: pchar): boolean;stdcall; 这个DLL是别的公司写的,我不知道源代码,只有接口说明书
      

  2.   

    问题多半出在pchar。以前DOS版下的Pascal(Delphi的前身),搞过一段时间的C、汇编与Pascal的混合编程,记得pascal规范里,字符串的第一个字节是字符串长度。不知道pchar是不是也这样的。你可以去Delphi版块去问问,如何把pchar类型转换为适当的.NET Framework类型。
      

  3.   

    都导出类型 pchar 了,明显 dll 作者已经处理成 C 接口了。
    关键 C# 这边难道不该这样吗?
    byte* pDataBack=stackalloc byte[3000];
      

  4.   


    可是这个需要回写噢~,回写用byte可以吗 ?还要加关键字 ref 噢
      

  5.   

    // 忘了 C# 的栈空间很小,当然,你那个错误提示并非栈溢出。
    // 干脆改用这样试试
    byte[] DataBack=new byte[30000];
    fixed (byte* pDataBack=DataBack) {
        readAnswer(ThreadNo, UniNumber, dwCommObj, ref pDataBack);
    }// 另外,你这怎么写的?
    [DllImport...]
    static extern
    bool readAnswer(int ThreadNo, int UniNumber, uint dwCommObj, ref byte pDataBack);
      

  6.   


    我这样写还是报同样的错误
    悲剧了。。我用C++调用就没问题,
    可以手动设置C#的栈大小吗?
    有QQ吗,能否加你QQ请教下,或者加我Q:273040644
      

  7.   

    试下这样bool readAnswer(int ThreadNo, int UniNumber, uint dwCommObj,string pDataBack);
      

  8.   

    DELPHI中函数的原型是:
    函数原型:function ReadAnswer (ThreadNo: integer; UniNumber: integer; dwCommObj: DWORD; var pDataBack: pchar): boolean;stdcall; 
      

  9.   

    这里,指针应当去掉 ref !
    readAnswer(ThreadNo, UniNumber, dwCommObj, pDataBack);
      

  10.   

    C#调用Delphi编译的DLL函数库返回大文本数据|C/S框架网|C# C/S框...http://www.csframework.com/archive/2/arc-2-20110324-1226.htm
      

  11.   

    这个问题还没解决,而且我再 windows 2003 上执行有问题,拷贝到我的win7上也没问题,windows2003 内存4G,我WIN7内存2G。。哎,无语了