2013-02-15 104 views
1

我正在加载一个dll,它自己产生了一些线程。时不时的程序崩溃与未处理的异常。我无法将所有库调用都包含在try/catch语句中,因为异常会在单独的线程上抛出,并且我无法访问库的源以调试/修复错误的错误处理。我希望程序在发生这些异常时继续做其他事情,是否有一种优雅的方式来处理这些异常?或者,我能做的唯一事情就是做一个全球性的捕获所有异常的方法吗?如何处理外部DLL中单独线程上的异常?

+1

如果可行,如果在单独的线程中有未处理的异常,则w3wp.exe不会崩溃。我的托管服务提供商已经发生好几次了...... – leppie 2013-02-15 20:31:03

回答

1

如果您将DLL加载到单独的应用程序域中,您应该能够隔离由AppDomain.UnhandledException生成的异常,但请注意,这并非万无一失,并且在某些情况下它仍会将您的过程排除并且你无能为力(堆栈溢出,内存不足等)。

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

1

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

这可以让你杀/重新启动时需要的过程......

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

  • 你可以使用COM(如果你实现它作为进程外,一个COM服务器)
  • 您可以使用共享内存(非常高的性能,看到this的演练和this对于.NET 2包装)

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