【问题标题】:Weird NullReferenceException in third party dll: C#第三方 dll 中奇怪的 NullReferenceException:C#
【发布时间】:2015-09-24 08:34:42
【问题描述】:

我有一个奇怪的错误,它突然开始,让我发疯。在我的 C# 应用程序中,我正在做一些繁重的数学计算,为此,我使用了 CenterSpace 的 NMath 库。最近,当我从 Visual Studio 2015 内部启动我的应用程序以对其进行调试时,每当我调用 NMath 库方法(以及我们编写的另一个库)时,应用程序开始崩溃,因为 NMath.dll 中的 NullReferenceExceptions .为了隔离问题,我只运行以下非常基本的矩阵乘法代码:

    static void Main(string[] args)
    {
        var mA = new DoubleMatrix(100, 200, 1.5);
        var mB = new DoubleMatrix(200, 50, 1.2);
        var mC = NMathFunctions.Product(mA, mB);
        Console.WriteLine(mC[5, 6]);

        Console.WriteLine("Computation finished");
        Console.ReadLine();
    }

当我因为 NullReferenceException 调用“NMathFunctions.Product”方法时,代码在第三行崩溃,异常详细信息如下:

它似乎只是在“NMathKernel”对象的构造函数中崩溃,因为没有正确设置对象引用。

最奇怪的是,当我使用 Windows 资源管理器而不是在 Visual Studio 中直接从其项目文件夹中运行完全相同的程序时,程序运行完美:第四行按预期打印“360.000000001”和“Console.已达到 ReadLine()"!

我完全不知道这个 NullReferenceException 错误的原因。这似乎不是与第三方 dll 相关的问题,因为该程序仅在从 Visual Studio 中启动时才会崩溃。这个错误完全阻止了我使用 Visual Studio 调试我的程序,这是一件痛苦的事情,让我只能从 Visual Studio 外部使用“Console.WriteLine”调用来调试它。这个问题的原因是什么?我的构建设置可能有问题吗? (顺便说一下,我检查并没有发现任何异常)任何线索或提示都非常欢迎。

【问题讨论】:

  • 发布堆栈跟踪而不是屏幕截图真的会更有帮助
  • 在调试时发生但不经常发生的异常是由以下两个原因之一引起的:代码专门检查附加的调试器并故意崩溃(用作基本的复制保护方案);或者有一些非托管代码在某处做错事,以某种方式被捕获在未优化的构建中(附加调试器会禁用优化)但不是其他情况(即有一个错误,即使没有附加调试器,它仍然会发生,但是代码很幸运并且不会崩溃)。无论如何,您需要让 NMath 作者回答您的问题。
  • @PeterDuniho 我认为 VS 只是在异常被库代码处理之前捕获了它。请参阅下面的答案。

标签: c# dll visual-studio-2015 nullreferenceexception nmath


【解决方案1】:
  1. 在 VisualStudio 中转到 Tools -> Options -> Debugging 并确保选中 Enable Just My Code 选项。
  2. 转到Debug -> Exceptions 并取消选中所有Thrown 复选框。仅选中 User-unhandled 复选框。或者直接使用Reset all 按钮。

【讨论】:

  • 非常感谢。所有异常都以某种方式标记为在 Visual Studio 设置中抛出,因此即使是由这些库完美处理的第三方库的异常也会被 VS 捕获和抛出。现在该程序似乎可以工作了。我的朋友,您将我从数小时徒劳的调试工作中解救出来。
  • 哈,我的超能力又派上用场了!
  • 非常感谢。我不知道 Just My Code 是如何被取消选中的,但我一直无法使用调试器,这解决了它。五年后仍然有意义!
猜你喜欢
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多