【问题标题】:System Arithmetic Exception: Delphi calling C# DLL via C++/CLI wrapper系统算术异常:Delphi 通过 C++/CLI 包装器调用 C# DLL
【发布时间】:2011-05-09 19:27:10
【问题描述】:

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

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

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

C# 公共方法的主体创建了一个新的 XslCompiledTransform 对象,并且当新创建的对象运行其 load 方法时会立即弹出异常。例如:

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

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

我想我应该提到再次调用对象的 load 方法可以正常工作。因此,捕获异常并运行该方法进行第二次“通过”就像弹出窗口阻止程序一样。但当然也有例外。

【问题讨论】:

  • 不能因为不够详细而责备帖子,这是肯定的。它实际上可能有助于对事物进行一些编码,并将除短 sn-ps 之外的所有内容放入您喜欢的文件中。可能会让更多人以这种方式阅读它。
  • 哈!是的,我是菜鸟。感谢您对我的耐心:)

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


【解决方案1】:

您可能会遇到如here 所述的浮点控制寄存器的差异。另见this QC 报告。您可以尝试调用 Set8087CW($133F);在您的 Delphi 程序中。之后要小心你的 Delphi 代码中的浮点问题。

【讨论】:

    【解决方案2】:

    随意的想法:

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

    【讨论】:

    • +1 表示“本机 Win32 程序集”注释。我们知道什么是“程序集”,它是您能找到的最远离托管代码的东西。 :P
    • 我给你三个字:ctrl。 alt。 C。没有它,调试 Delphi 就不一样了。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多