.net 有没有办法';手柄';环境。快速失效?
因此,我们的应用程序有一个漂亮的中央异常处理程序,其中记录了异常的详细信息,向用户显示通用窗口,并以一种优雅的方式关闭。然而,我们现在有了一个第三方组件,它不时(可能出于完全合理的原因)调用Environment.FailFast。这让我们的应用程序一败涂地,对我们的用户来说看起来非常糟糕。有什么方法可以优雅地处理Environment.FailFast吗?根据MSDN中的各种条目,我看不出有什么方法,这是该过程的硬终止。为处理此问题而创建的任何代码都将驻留在流程中。它也不会运行finally块或任何挂起的终结器,所以我猜它不会提供任何事件或钩子来允许自定义代码运行。在某种程度上,这是有意义的,否则它可能不会“快速”失败,并且它主张只在极端流程腐败的情况下使用 我认为有两个和三个选择:.net 有没有办法';手柄';环境。快速失效?,.net,error-handling,.net,Error Handling,因此,我们的应用程序有一个漂亮的中央异常处理程序,其中记录了异常的详细信息,向用户显示通用窗口,并以一种优雅的方式关闭。然而,我们现在有了一个第三方组件,它不时(可能出于完全合理的原因)调用Environment.FailFast。这让我们的应用程序一败涂地,对我们的用户来说看起来非常糟糕。有什么方法可以优雅地处理Environment.FailFast吗?根据MSDN中的各种条目,我看不出有什么方法,这是该过程的硬终止。为处理此问题而创建的任何代码都将驻留在流程中。它也不会运行finally块
您可以在新流程中执行第三方代码 一种简单的方法是将第三方代码包装到一个可执行文件中,然后使用
请注意,我找不到FailFast之后的错误级别的文档。当我测试它时,我得到的值是
-2146232797
..当问题的唯一可用解决方案来自第三方供应商时,我不得不这样做。它有点不稳定,用于使整个过程崩溃。只有在您无法找到替代供应商或解决方案的情况下,我才建议您这样做,因为如果您需要代码彼此对话,这也会强制使用进程间通信(或其他一些跨进程边界对话的机制)。我这么做了,非常头疼,但我承认它是有效的。从.NET源代码中,-2146232797
是,它用作退出代码。不是MSDN文档,而是至少可以解释其价值的东西。这些问题都是用老式的方式解决的。拿起电话给他们打个电话。解决一些问题,这样你至少可以配置它,这样它就不会再这样做了。无止境地偏爱某些绝望的东西,比如在一个单独的进程中运行它。@HansPassant不能+1这就足够了!第三方有可用的源代码;他们似乎没有直接呼叫环境。FailFast。。。相当地()根据我的经验,调用Environment.FailFast()
将导致同步调用AppDomain.CurrentDomain.UnhandledException
事件。然而,这显然不能用来避免海报试图避免的不可避免的“丑陋”窗口对话。我甚至尝试将Process.GetCurrentProcess().Kill()
放入该偶数处理程序中,但仍然收到Windows消息。还有三种方法可以解决此问题:① <代码>故障快< /COD>调用内部的Win32函数,它可以钩住(钩子需要用C++原生语言编写);② 您可以创建自己的CLR主机,这并不难,它解决了@DaveTillman的问题(您可以阻止该对话框);③ 如果DLL没有使用编织(即使用)进行签名,则可以删除有问题的代码