处理非托管代码未明确抛出的访问冲突异常

Handle Access Violation Exception that is not explicitly thrown by unmanaged code

我知道 Access Violation Exception 是一个严重的问题,我不应该真正尝试处理。 我也知道在最新版本的 .Net 中,可以通过

处理此异常
  1. 将此 <legacyCorruptedStateExceptionsPolicy enabled="true"> 放入配置中,所有 catch 块将能够捕获错误
  2. HandleProcessCorruptedStateExceptions 属性修饰要捕获这些异常的方法

其实this说的很清楚

但我的情况有点不同,我似乎找不到解决方案: 我正在使用一个非托管 C++ 库,我将在我的应用程序的某个时刻初始化它。然后这个dll本身会自己执行一些任务(从服务器拉取数据到缓存,日志记录等)这个Access Violation Exception看起来是在这个过程中抛出的,而不是当appication直接调用dll的api时。所以我没办法 try catch 有问题的逻辑。

在这个阶段,我已经设法在 AppDomain.CurrentDomain.UnhandledException 中捕获了它,如下所示:

    [HandleProcessCorruptedStateExceptions, SecurityCritical]
    private static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Logger.Error("Unhandle Exception", (Exception)e.ExceptionObject);
    }

但我仍然不能完全防止应用程序崩溃。 我知道我可能应该让应用程序崩溃。但我真的相信这个错误并不像它看起来那么糟糕,我只需要知道如何抑制它,即使我可能不会使用它。

有什么想法吗?

Access violation exception 表示出现严重问题,需要修复。不建议在出现此类错误后继续 运行ning,因为您无法确定进程的状态,如果您尝试继续,可能会导致更严重的错误。如果这是在由第三方代码启动的线程上引发的,据我所知,您几乎无能为力。我不确定为什么你认为它没有看起来那么糟糕,但我会非常小心地处理它。

如果您无法访问第三方代码,最好的解决方案可能是联系作者并解决问题。第二好的解决方案可能是 运行 第三方代码在一个单独的进程中。这样您就可以确保您的进程在代码崩溃时不会受到损害。