系统算术异常:Delphi通过C ++ / CLI包装器调用C#DLL

时间:2009-09-16 18:25:03

标签: c# delphi interop c++-cli pointer-arithmetic

我有一个C#DLL,它使用XslCompiledTransform类进行xml操作。我偷了C#DLL的C ++ / CLI包装器。

当使用Delphi 5实现C ++ / CLI包装器时,我收到系统算术错误。这是Delphi 5声明:

procedure XsltMethod(XmlPath, XsltPath: PWideChar); cdecl; external 'ahma.dll';

C#public方法的主体创建一个新的XslCompiledTransform对象,当新创建的对象运行其加载方法时,该异常会立即弹出。例如:

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(XsltFile);

如前所述,从.NET DLL抛出的异常是系统算术异常。这只发生在从Delphi可执行文件调用时。

我想我应该提一下,调用对象的加载方法再次正常工作。因此捕获异常并运行第二个“pass”的方法就像弹出窗口阻止程序一样。但是对于例外,当然。

2 个答案:

答案 0 :(得分:2)

随机想法:

  • 我认为您应该首先从Visual Studio调试程序集。在Delphi代码中插入消息框或其他等待语句,然后从Visual Studio附加到进程。跟踪C#可能会提供一些关于出错的提示。如果无法使其正常工作,请至少添加传入参数的日志记录。
  • 在delphi中,您不需要转义反斜杠。
  • 你确定E0434F4D不是一些无辜的第一次机会异常吗?如果你不调试(或继续从JIT调试器异常停止,我不能完全确定Delphi 5可能),这种行为确实有问题吗?
  • 我们可以将“本机Win32程序集”称为“DLL”,就像过去20年来我们称之为“DLL”一样吗? :-)

答案 1 :(得分:2)

如果你说here,你可能会遇到浮点控制寄存器的差异。另请参阅this质量控制报告。您可以尝试拨打Set8087CW(133F);在您的Delphi程序中。之后要小心Delphi代码中的浮点问题。