そのため、このアプリケーションには、例外の詳細がログに記録され、一般的なウィンドウがユーザーに表示され、シャットダウンが適切に行われる、優れた中央の例外ハンドラーがあります。ただし、現在、Environment.FailFastを呼び出すサードパーティコンポーネントがあります(場合によっては完全に有効な理由で)。これは私たちのアプリを水から吹き飛ばし、ユーザーにはかなりひどいように見えます。Environment.FailFastをエレガントな方法で処理する方法はありますか?
2 に答える
方法がわかりません。MSDNのさまざまなエントリによると、これはプロセスのハード終了です。これを処理するために作成するコードはすべて、プロセス内に存在します。また、finallyブロックや保留中のファイナライザーは実行されないため、カスタムコードを実行できるようにするためのイベントやフックは提供されないと思います。ある意味で、これは理にかなっています。そうでなければ、「高速」に失敗しない可能性があり、極端なプロセス破損の場合にのみ使用することを主張します。
http://msdn.microsoft.com/en-us/library/dd289241
2つの3つのオプションがあります。
- コードを変更してこの呼び出しを削除するようにベンダーにリクエストを送信します。
- 新しいベンダーを見つけます。
- @RBによって提案されたように。このDLLの使用を新しいプロセスにファーム化して、コアアプリケーションプロセスの安全性を維持します。私はこれを一度やった、大きな頭痛がしたが、「うまくいった」。提案1または2を利用できない場合にのみ、これをお勧めします。
MSDNからの引用:
このメソッドは、アクティブなtry/finallyブロックまたはファイナライザーを実行せずにプロセスを終了します。
FailFastメソッドは、メッセージ文字列をWindowsアプリケーションイベントログに書き込み、アプリケーションのダンプを作成してから、現在のプロセスを終了します。メッセージ文字列は、Microsoftへのエラー報告にも含まれています。
アプリケーションの状態が修復不可能なほど損傷している場合は、Exitメソッドの代わりにFailFastメソッドを使用してアプリケーションを終了し、アプリケーションのtry/finallyブロックとファイナライザーを実行するとプログラムリソースが破損します。
新しいプロセスでサードパーティのコードを実行できます。
これを行う簡単な方法は、サードパーティのコードを実行可能ファイルにラップし、Process.Startを使用してこれを起動することです。
FailFastに続くエラーレベルのドキュメントが見つからないことに注意してください。私がそれをテストしたとき、私が得た値は-2146232797
...