8

ファイナライザーで例外をスローする不正なライブラリで問題が発生しました。もちろん、アプリケーションがクラッシュします。

これを回避するために、ライブラリを独自のAppDomainにロードしようとしましたが、例外が表面に表示され、アプリケーションがクラッシュします。

MSDNに記載されているように、に登録しAppDomain.UnhandledExceptionても例外が発生するのを防ぐことはできませんが、「サブAppDomain」でそのような例外をキャッチする方法が他にないことに非常に驚いています。

プラグインホスト、またはAppDomainsを使用して潜在的に有害なコードをサンドボックス化するアプリケーションは、未処理の例外を停止するためにどのように機能しますか?それは実際に可能ですか?

:私はすでに別の回避策を持っています。これはここで説明されています。不正なファイナライザーは、シャットダウン中にのみ収集されるように見える長期間のオブジェクト上にあるため、この「偽の」エラーをユーザーから隠すだけで十分です。それでも、この回避策は脆弱であることがわかります。これは、他の実際のエラーを隠すか、オブジェクトが以前に収集された場合にアプリケーションを爆破するリスクがあるためです。

4

2 に答える 2

4

AppDomainは、プログラムの状態を捨てることができるので便利ですが、それでもスレッドが停止しているという問題があります。これがファイナライザスレッドで発生することは致命的であり、CLRは頼ることなくプロセスを中止します。

唯一の「修正」は、このコンポーネントを独自のプロセスで実行することです。Process.Kill()を使用してヘッドでシュートし、プロセスの終了時にファイナライザースレッドが実行されないようにすることができます。.NETがサポートするプロセス間通信メカニズムの1つを使用して通信します。パイプ、リモーティング、またはWCFという名前のソケット。それで頑張ってください。

于 2010-10-11T13:53:35.480 に答える
0

実際、.NET 1.0 / 1.1に戻ると、必要に応じて動作していました。「ランタイム」ノード内のアプリケーション構成ファイルにこの行を追加するだけで、この動作に戻すことができます。

<runtime>
    <legacyUnhandledExceptionPolicy enabled="1"/>
</runtime>

これにより、別のスレッドで未処理の例外がプロセス全体を終了するのを防ぐことができます。

于 2011-05-12T09:52:06.417 に答える