2012-05-25 120 views
3

因此,我们的应用程序有一个很好的中央异常处理程序,其中记录异常的详细信息,向用户显示通用窗口,并以优雅的方式进行关机。但是,我们现在有一个第三方组件,它不时(可能出于完全正确的原因)调用Environment.FailFast。这使我们的应用程序不受用户的欢迎,而且对我们的用户来说看起来相当糟糕。有没有办法以优雅的方式处理Environment.FailFast?有没有办法'处理'Environment.FailFast?

+5

这些问题是以老式的方式解决的。拿起电话并给他们打电话。解决这个问题,至少可以配置它,这样它就不会再这样做了。无休止地喜欢某种绝望的东西,比如在一个单独的过程中运行它。 –

+0

@HansPassant不能+1那么多! –

+0

第三方具有可用的源代码;它似乎不直接调用Environment.FailFast ...而是...(http://stackoverflow.com/questions/10757164/under-what-c​​ircumstances-could-uielement-updatelayout-call-environment-failfas) – GWLlosa

回答

4

我看不到一个办法,根据MSDN中的各种条目,这是一个很难终止的过程。您要创建的任何代码都将驻留在此过程中。它也不会运行finally块或任何挂起的终结器,所以我猜测不会提供任何事件或钩子以允许自定义代码运行。从某种意义上讲,这种方法很有意义,否则它可能不会“快速”失败,而且它只能用于极端过程腐败的情况。

http://msdn.microsoft.com/en-us/library/dd289241

我看到三个选项:

  1. 传送给供应商的要求更改代码并删除此调用。
  2. 寻找新的供应商。
  3. 正如@RB所建议的那样。将这个DLL的使用放到一个新的进程中,这样核心应用程序进程就会保持安全。我曾经这样做过,头痛很大,但是“有效”。 我只会建议这个,如果你不能利用建议1或2!从MSDN

引用:

该方法终止进程不运行任何活性 的try /最后块或终结。

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

使用FAILFAST方法,而不是退出方法来终止您 的应用程序,如果你的应用程序的状态被损坏无法修复, 和执行应用程序的尝试/ finally块和终结 会破坏程序的资源。

+0

我的经验是调用'Environment.FailFast()'会导致AppDomain。 CurrentDomain.UnhandledException'事件被同步调用。但是,这显然不能用于避免海报试图避免的不可避免的“丑陋”Windows对话框。我甚至试图把一个'Process.GetCurrentProcess().Kill()'放到那个处理程序中,但我仍然得到了Windows消息。 –

+0

还有三种方法可以解决这个问题:①'FailFast'在内部调用一个可以挂钩的Win32函数(虽然挂钩需要用C++本地编写); ②你可以创建自己的CLR主机,甚至不那么难,它解决了@ DaveTillman的问题(你可以阻止对话); ③如果DLL未使用编织进行签名,即使用[Fody](https://github.com/Fody/Fody) – Abel

2

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

这样做的一种简单方法是将第三方代码包装在可执行文件中,并使用Process.Start启动该代码。

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

+0

,则可以删除有问题的代码当必须解决问题的唯一方法是从第三方供应商。它稍微不稳定,并且用于使整个过程崩溃。如果您无法找到替代供应商或解决方案,我会建议您这样做 - 因为如果您需要代码相互交流,这也会使用进程间通信(或跨越流程边界的其他一些机制)。我做到了这一点,特别头痛,但是让它工作。 –

+2

从.NET源代码中,'-2146232797'是['COR_E_FAILFAST'](https://github.com/dotnet/coreclr/blob/6f3e349b80f713d902e0d47eac1948f6c6a4296d/src/pal/prebuilt/inc/corerror.h#L780),其中['Environment.FailFast'](https://github.com/dotnet/coreclr/blob/7045ca7a6de381b382a709dc0a61f49ca713d160/src/classlibnative/bcltype/system.cpp#L623)用作退出代码。不是MSDN文档,但至少有一些解释价值。 – chwarr

相关问题