C#调用非托管DLL出错,提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

ashbug 2008-06-13 05:06:42
我的程序使用一个表格编辑控件,其中一部分特殊的处理是旧版本用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); //这一句出错
}

}
...全文
493 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ashbug 2008-06-14
  • 打赏
  • 举报
回复
问题已解决。

我用了这个表格对象特有两个函数: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 来传递就可以。大胆猜测或许是因为对象变量是引用类型的,它的数据被分配在堆中,可能是被列于托管资源的保护中吧,而值变量数据被分配至栈中,而这部分被放松管制?
yatobiaf 2008-06-13
  • 打赏
  • 举报
回复
CellJiSuan.dll那里面的函数接口是什么样子的啊?我估计就是因为没有分配空间造成的
绝代坏坏 2008-06-13
  • 打赏
  • 举报
回复
c#可以调用delphi的dll么?学习.

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧