Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 有没有办法';手柄';环境。快速失效?_.net_Error Handling - Fatal编程技术网

.net 有没有办法';手柄';环境。快速失效?

.net 有没有办法';手柄';环境。快速失效?,.net,error-handling,.net,Error Handling,因此,我们的应用程序有一个漂亮的中央异常处理程序,其中记录了异常的详细信息,向用户显示通用窗口,并以一种优雅的方式关闭。然而,我们现在有了一个第三方组件,它不时(可能出于完全合理的原因)调用Environment.FailFast。这让我们的应用程序一败涂地,对我们的用户来说看起来非常糟糕。有什么方法可以优雅地处理Environment.FailFast吗?根据MSDN中的各种条目,我看不出有什么方法,这是该过程的硬终止。为处理此问题而创建的任何代码都将驻留在流程中。它也不会运行finally块

因此,我们的应用程序有一个漂亮的中央异常处理程序,其中记录了异常的详细信息,向用户显示通用窗口,并以一种优雅的方式关闭。然而,我们现在有了一个第三方组件,它不时(可能出于完全合理的原因)调用Environment.FailFast。这让我们的应用程序一败涂地,对我们的用户来说看起来非常糟糕。有什么方法可以优雅地处理Environment.FailFast吗?

根据MSDN中的各种条目,我看不出有什么方法,这是该过程的硬终止。为处理此问题而创建的任何代码都将驻留在流程中。它也不会运行finally块或任何挂起的终结器,所以我猜它不会提供任何事件或钩子来允许自定义代码运行。在某种程度上,这是有意义的,否则它可能不会“快速”失败,并且它主张只在极端流程腐败的情况下使用

我认为有两个和三个选择:

  • 向供应商发送更改代码并删除此呼叫的请求
  • 寻找新的供应商
  • 正如@RB所建议的那样。将此DLL的使用转移到新进程中,以便核心应用程序进程保持安全。我做过一次,非常头痛,但“成功了”如果您不能利用建议1或2,我只建议您这样做
  • 引用MSDN:

    此方法在不运行任何活动进程的情况下终止进程 try/finally块或终结器

    FailFast方法将消息字符串写入Windows 应用程序事件日志,创建应用程序的转储,然后 终止当前进程。消息字符串也包含在 向Microsoft报告错误

    使用FailFast方法而不是Exit方法来终止您的应用程序 应用程序如果应用程序的状态损坏无法修复, 以及执行应用程序的try/finally块和终结器 将损坏程序资源


    您可以在新流程中执行第三方代码

    一种简单的方法是将第三方代码包装到一个可执行文件中,然后使用


    请注意,我找不到FailFast之后的错误级别的文档。当我测试它时,我得到的值是
    -2146232797
    ..

    当问题的唯一可用解决方案来自第三方供应商时,我不得不这样做。它有点不稳定,用于使整个过程崩溃。只有在您无法找到替代供应商或解决方案的情况下,我才建议您这样做,因为如果您需要代码彼此对话,这也会强制使用进程间通信(或其他一些跨进程边界对话的机制)。我这么做了,非常头疼,但我承认它是有效的。从.NET源代码中,
    -2146232797
    是,它用作退出代码。不是MSDN文档,而是至少可以解释其价值的东西。这些问题都是用老式的方式解决的。拿起电话给他们打个电话。解决一些问题,这样你至少可以配置它,这样它就不会再这样做了。无止境地偏爱某些绝望的东西,比如在一个单独的进程中运行它。@HansPassant不能+1这就足够了!第三方有可用的源代码;他们似乎没有直接呼叫环境。FailFast。。。相当地()根据我的经验,调用
    Environment.FailFast()
    将导致同步调用
    AppDomain.CurrentDomain.UnhandledException
    事件。然而,这显然不能用来避免海报试图避免的不可避免的“丑陋”窗口对话。我甚至尝试将
    Process.GetCurrentProcess().Kill()
    放入该偶数处理程序中,但仍然收到Windows消息。还有三种方法可以解决此问题:① <代码>故障快< /COD>调用内部的Win32函数,它可以钩住(钩子需要用C++原生语言编写);② 您可以创建自己的CLR主机,这并不难,它解决了@DaveTillman的问题(您可以阻止该对话框);③ 如果DLL没有使用编织(即使用)进行签名,则可以删除有问题的代码