【发布时间】: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# 代码行为不端。
-
谢谢,确实是这个错误。