我有一个 WPF 应用程序,我必须加载 DLLcc3260mt.dll
我通过使用 LoadLibrary() 来调用它,但无论出于何种原因,我都收到了 ArithmeticException。
我的代码如下:
public partial class MainWindow : Window
{
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
static extern IntPtr FreeLibrary(IntPtr hModule);
public MainWindow()
{
InitializeComponent();
try
{
string cc3260mtPath = "dll/cc3260mt.dll";
IntPtr cc3260Link = LoadLibrary(cc3260mtPath);
}
catch (Exception ex)
{
Console.WriteLine("ERROR : " + ex.Message);
}
} // <-- This is where I get the Exception.
}
当我逐步运行代码时,我可以清楚地看到当我退出 MainWindow() 类时出现异常。
你们知道是什么让我这个例外吗?
那是旧的 Borland C 或 C++ 程序的 C 运行时支持库。是的,它做了一些事情very一般而言,与 .NET 代码(尤其是 WPF)不兼容,它会重新编程浮点单元控制寄存器。它启用硬件异常,在浮点运算失败时触发。在 WPF 中尤其有问题,因为喜欢大量使用 Double.NaN。它会生成 FPU 异常,CLR 会拦截它并将其重新引发为 ArithmeticException。
您必须撤消该 DLL 所做的操作并恢复 FPU 控制字。这是有问题的,.NET 不允许您直接访问这样的硬件。不过,您可以使用一个技巧,即 CLR 在处理异常时自动重新编程 FPU。所以你可以故意地生成异常并捕获它。像这样:
IntPtr cc3260Link = LoadLibrary(cc3260mtPath);
try { throw new Exception("Ignore this please, resetting the FPU"); }
catch (Exception ex) {}
请注意这样做的结果,您现在将运行本机代码,而不会出现它通常依赖的异常。也许这会起作用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)