【问题标题】:SEHException in .Net.Net 中的 SEHException
【发布时间】:2016-06-30 01:54:29
【问题描述】:

设置:

  • .Net-DLL 用 C# 编写
  • C++/CLI Wrapper-Dll 调用 .Net-DLL
  • VS2013,Windows7 32Bit,.Net 4.5.2

将大于 2^31-1 的值分配给 .Net-DLL 中的 double 将导致 SEHException,对于较小的值,一切正常。

public void Foo()
{
    double foo = 2147483648d;
        ...
}

从 C++/CLI 调用时会抛出 SEHexception,而

public void Foo()
{
    double foo = 2147483647d;
        ...
}

没有。任何想法为什么会发生这种情况以及如何避免异常?

【问题讨论】:

  • 你的问题是什么?
  • 您可能正在一个库中运行本机代码,该库修改了 FPU 控制字并启用了浮点异常。这是托管代码的毒药。开始调试并使用 Debug > Windows > Registers。右键单击,勾选“浮点”。 CTRL 寄存器值很重要,它需要是 0x027F。当您单步执行代码并看到它发生变化时,您就找到了麻烦制造者。 Borland CRT 是一个常见的原因。您可以使用 _control87() 更正它,但您可以决定是制作库还是 C# 代码行为不端。
  • 谢谢,确实是这个错误。

标签: c# .net c++-cli


【解决方案1】:

DLL 是从改变 FPU 控制世界的应用程序调用的。设置

_control87(_CW_DEFAULT, MCW_EM);

在调用托管 DLL 之前在 C++/CLI Wrapper-DLL 中进行快速修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2011-10-18
    • 2012-05-11
    • 2015-09-07
    相关资源
    最近更新 更多