我的程序使用一个表格编辑控件,其中一部分特殊的处理是旧版本用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); //这一句出错
} }
代码如下:(里面的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); //这一句出错
} }
解决方案 »
- WinForm DataGridView控件如何实现类似Excel中的求和? [图]
- 為什麼會這樣?咋辦呢?
- ItemDataBound事件的循环次数在那里设定?
- 发现VS2005 做ASP.NET不会自动编译cs文件了
- 有两个框架left和main,在一个Main框架中有一个按钮点击一下使left框架的宽度减20象素
- C#如何 操作excel文件
- 请问《C#高级编程》第二版(1030页)比前一版本(1180页)的内容区别到底有多大?我现有前一版本,还需要再购买第二版本吗?请赐教!
- 实在是没办法了,快一下午都还没有搞定,大家帮我看看
- 怎样合理地再现主窗体?????
- C# picturebox 问题
- SQL中多行数据,按照相同列,组合成一条数据
- 关于控件重用的问题!!!
JiSuan(ref Buffer0);
cell.ReadFromBuffer(Buffer0);将参数用值方式传递,而DLL的Delphi那边这样生明:
function JiSuan(var cl: OleVariant): integer; 传递对象不行,传递变量就可以。虽然解决了,但我对这个问题还是不太明白,我向DLL传递是一个对象,这个对象是在托管资源下是受到保护,在非托管的DLL修改它的数据时,必然是不行的。可我在传递这个对象时无论用ref 还是 out 都不行,而把参数作为一个值变量用ref 来传递就可以。大胆猜测或许是因为对象变量是引用类型的,它的数据被分配在堆中,可能是被列于托管资源的保护中吧,而值变量数据被分配至栈中,而这部分被放松管制?