每当我加载它时,C# - cc3260mt.dll都会抛出ArithmeticException

时间:2014-02-12 09:40:08

标签: c# wpf visual-studio-2012 dll loadlibrary

我有一个WPF应用程序,我必须加载DLL cc3260mt.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()类时出现异常。
你们有什么想法让我这个例外吗?

1 个答案:

答案 0 :(得分:3)

这是旧的Borland C或C ++程序的C运行时支持库。是的,它确实非常与.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) {}

请注意这一点,您现在可以运行本机代码,而不会通常依赖它。也许那会奏效。