【问题标题】:How to deal with exceptions on separate threads in an external dll?如何处理外部dll中单独线程上的异常?
【发布时间】:2013-02-15 20:17:08
【问题描述】:

我正在加载一个 dll,该 dll 本身会产生一些线程。程序时不时地因未处理的异常而崩溃。我无法将所有库调用包装在 try/catch 语句中,因为异常是在单独的线程上引发的,而且我无权访问库的源来调试/修复错误处理。我希望程序在这些异常发生时继续做其他事情,有没有一种优雅的方式来处理这些异常?还是我唯一能做的就是做一个全局的 catch all exceptions 方法?

【问题讨论】:

  • 如果可能的话,如果您在单独的线程中有未处理的异常,w3wp.exe 不会崩溃。我的托管服务提供商已经发生过几次...

标签: c#


【解决方案1】:

如果您将 DLL 加载到单独的 appdomain 中,您应该能够隔离使用 AppDomain.UnhandledException 生成的异常,但是请注意,这不是万无一失的,在某些情况下它仍会导致您的进程退出你也无能为力(堆栈溢出、内存不足等)。

在这种情况下,您可以做的最好的事情是使用某种 dll 通信工具将它们完全加载到一个单独的进程中,并使用某种形式的远程处理与该进程对话。

【讨论】:

    【解决方案2】:

    我建议您实现一个单独的进程 (EXE),您的应用程序会启动该进程并依次加载 DLL。

    这允许您在需要时终止/重新启动进程...

    我看到了几个关于如何沟通的选项 - 例如:

    • 您可以使用 COM(如果您将其实现为进程外 COM 服务器)
    • 您可以使用共享内存(非常高性能,请参阅 this 了解演练,this 了解 .NET 2 包装器)

    如果该方法必须与多个 Windows 版本兼容,那么我将避免为 IPC 使用任何“网络”(因为有些带有桌面防火墙)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      相关资源
      最近更新 更多