web-dev-qa-db-ja.com

C#/。NETで「プログラムが動作を停止しました」を回避する

スクリプト(nant)から実行したいC#/。NETで記述されたコンソールアプリケーションがあります。コンソールアプリケーションで例外が発生した場合、続行したいのですが、Windows Vistaでは、解決策を検索してデバッグなどを求めるポップアップが表示されます。

コンソールアプリケーションで例外が発生したときに「プログラムが動作を停止しました」というポップアップが表示されないようにしたいと思います。 C#/。NETからこれを制御するにはどうすればよいですか?

(同様の質問で対処します C言語の問題 ですが、C#/。NETの解決策が必要です。)

(明確にするために:例外をnantに渡したいのですが、ポップアップなしです。)

29
Ole Lynge

JITデバッガーのポップアップは、未処理の例外がある場合に発生します。つまり、例外は、ランタイム内の任意のスレッドのルートまでスタックをトンネリングします。

これを回避するには、 _AppDomain.CurrentDomain.UnhandledException_ イベントを処理し、 Environment.Exit(1) を呼び出して正常に終了します。

これにより、AppDomain内のすべてのスレッドですべての例外が処理されます。特別なことをしているのでない限り、アプリにはおそらくAppDomainが1つしかないため、これを_public static void Main_メソッドに入れるだけで十分です。

_AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
    Console.Error.WriteLine("Unhandled exception: " + args.ExceptionObject);
    Environment.Exit(1);
};
_

この場合も、NAntロガーを使用してエラーを書き出す必要があります(ただし、このオフハンドのAPIを思い出すことはできません)。

マシン上で JITデバッグを無効にする することもできます。専用のビルドサーバーなど、特定の状況でのみこれをお勧めします。

42
Drew Noakes

例外をキャッチして、ログに記録するか無視するだけです。

1
maciejkow

未処理の例外が原因でポップアップが表示されます。これを回避するには、メインメソッドがすべての例外をキャプチャし、それらを取得できる他の有用な情報に変換するようにしてください。例外を無視することはお勧めしません。

ところで、例外はスレッドごとであることに注意してください。したがって、アプリケーションがスレッドを生成したり、スレッドプールスレッドを使用したりする場合は、これらのハンドラーも必要です。

1
Brian Rasmussen

Windows Vistaでは、プログラムに対してこのダイアログを無効にすることができます。

「問題レポートと解決策機能」を無効にします。 [コントロールパネル]-> [問題レポートと解決策]-> [設定の変更]-> [詳細設定]-> [プログラムの電源を切る]、[問題の報告]にあります。

1
Jehof

通常、これはアプリが例外を処理しない場合にのみ発生します。コンソールアプリ全体をtry/catchブロックでラップし、失敗コードを返すだけで、これを回避できます。

0
Neil N