我的程序使用一个表格编辑控件,其中一部分特殊的处理是旧版本用Delphi写的,我把这部分特殊处理代码封装成了DLL。使用Delphi自己写了个例子的代码调用这个DLL没有问题,但使用C#调用时却出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”,请教高手这个问题怎么办?
代码如下:(里面的cell是一个表格控件)
        [DllImport(@".\\bin\\CellJiSuan.dll", CharSet = CharSet.Auto, EntryPoint = "JiSuan", SetLastError = true,
              ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        static extern  int JiSuan(out AxCELL50Lib.AxCell cell);        public static void CallJiSuan(AxCELL50Lib.AxCell cell)
        {
            string DllFile = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + "\\bin\\CellJiSuan.dll";
            if (System.IO.File.Exists(DllFile))
            {
                JiSuan(out cell);  //这一句出错
            }        }

解决方案 »

  1.   

    CellJiSuan.dll那里面的函数接口是什么样子的啊?我估计就是因为没有分配空间造成的
      

  2.   

    问题已解决。我用了这个表格对象特有两个函数:SaveToBuffer、ReadFromBuffer将对象保存为System.object类型(好像是类似流吧),然后这样传递:cell.SaveToBuffer(Buffer0);
    JiSuan(ref Buffer0);  
    cell.ReadFromBuffer(Buffer0);将参数用值方式传递,而DLL的Delphi那边这样生明:
    function JiSuan(var cl: OleVariant): integer; 传递对象不行,传递变量就可以。虽然解决了,但我对这个问题还是不太明白,我向DLL传递是一个对象,这个对象是在托管资源下是受到保护,在非托管的DLL修改它的数据时,必然是不行的。可我在传递这个对象时无论用ref 还是 out 都不行,而把参数作为一个值变量用ref 来传递就可以。大胆猜测或许是因为对象变量是引用类型的,它的数据被分配在堆中,可能是被列于托管资源的保护中吧,而值变量数据被分配至栈中,而这部分被放松管制?