C# 如何处理外部dll中独立线程上的异常?
我正在加载一个dll,它会在自己内部生成几个线程。程序偶尔会因未处理的异常而崩溃。我无法将所有库调用包装在try/catch语句中,因为异常是在不同的线程上引发的,并且我没有访问库的源代码来调试/修复错误处理。我希望程序在这些异常发生时继续执行其他操作,有没有一种优雅的方法来处理这些异常?或者是我唯一能做的全局捕获所有异常的方法吗?如果将DLL加载到单独的appdomain中,您应该能够隔离使用C# 如何处理外部dll中独立线程上的异常?,c#,C#,我正在加载一个dll,它会在自己内部生成几个线程。程序偶尔会因未处理的异常而崩溃。我无法将所有库调用包装在try/catch语句中,因为异常是在不同的线程上引发的,并且我没有访问库的源代码来调试/修复错误处理。我希望程序在这些异常发生时继续执行其他操作,有没有一种优雅的方法来处理这些异常?或者是我唯一能做的全局捕获所有异常的方法吗?如果将DLL加载到单独的appdomain中,您应该能够隔离使用appdomain生成的异常。未处理的异常,但是,请注意,这不是万无一失的,在某些情况下,它仍然会使您
appdomain生成的异常。未处理的异常
,但是,请注意,这不是万无一失的,在某些情况下,它仍然会使您的进程退出,并且对此您无能为力(堆栈溢出、内存不足等)
在这种情况下,最好使用某种dll通信工具将它们完全加载到一个单独的进程中,并使用某种形式的远程处理与该进程通信。我建议实现一个单独的进程(EXE),由应用程序启动,然后再加载dll 这允许您在需要时终止/重新启动进程 我看到了几个关于如何沟通的选项,例如:
- 您可以使用COM(如果您将其实现为进程外COM服务器)
- 您可以使用共享内存(非常高的性能,有关演练和.NET2包装器,请参阅)
如果该方法必须与多个Windows版本兼容,那么我将避免在IPC中使用任何“网络”功能(因为有些功能带有桌面防火墙)。如果这是可能的,如果在单独的线程中出现未处理的异常,w3wp.exe将不会崩溃。已经和我的主机提供商发生过几次了。。。