ここでは、Windowsフォームアプリケーションやコンソールアプリケーションで、自分自身のアプリケーション(あるいは、プログラム、プロセス)を終了させる方法について説明します。
なお外部のアプリケーションを終了させる方法は、「プロセスを強制的に終了する」で説明しています。
Windowsフォームアプリケーションの場合は、通常は、メインフォーム(メインウィンドウ)を閉じるとアプリケーションが終了します。
メインフォームとは、スプラッシュウィンドウなど一時的に表示されるフォームを除き、通常一番初めに表示されるフォームです。もっと具体的に言えば、アプリケーション開始時にApplication.Runメソッドに引数として渡したフォーム(VB.NETでは、スタートアップフォームに指定したフォーム)のことです。詳しくは、「フォームを連続して表示する」の「メインフォームを入れ替える」をご覧ください。
フォームを閉じるには、Form.Closeメソッドを使います。詳しくは、「フォームを閉じる」で説明しています。
'自分自身のフォームがメインフォームの時、 '自分自身のフォームをCloseメソッドで閉じると、アプリケーションが終了する Me.Close()
//自分自身のフォームがメインフォームの時、 //自分自身のフォームをCloseメソッドで閉じると、アプリケーションが終了する this.Close();
Windowsフォームアプリケーションで、メインフォームが分からない、存在しないなどの場合は、Application.Exitメソッドでアプリケーションを終了させることもできます。
補足:Application.Exitメソッドは、Application.Runメソッドで開始されたメッセージループを終了させるために使用されます。つまり、このメソッドはRunメソッドを返します。Application.Exitメソッドはすべてのスレッドで実行中のメッセージループを終了させますが、現在のスレッドのメッセージループだけを終了するには、Application.ExitThreadメソッドを使用します。
'Imports System.Windows.Forms
'アプリケーションを終了する
Application.Exit()
//using System.Windows.Forms;
//アプリケーションを終了する
Application.Exit();
Application.Exitメソッドを呼び出しても、すぐにアプリケーションが終了する訳ではありません。Application.Exitメソッドを呼び出すと、現在開いているすべてのフォームを閉じようとします。この時、.NET Framework 2.0以降では、フォームのFormClosingイベントとFormClosedイベントが発生します。しかし、ClosingイベントとClosedイベントは発生しません。さらに、Application.Exitメソッドの後にコードが続いている場合は、それが実行されます。
例えば以下のようなコードでButton1をクリックすると、出力ウィンドウには「FormClosed」の後で「Exit」と表示され、アプリケーションが終了します。
'Button1のClickイベントハンドラ Private Sub Button1_Click(sender As Object, e As System.EventArgs) _ Handles Button1.Click Application.Exit() Console.WriteLine("Exit") End Sub 'フォームのFormClosedイベントハンドラ Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) _ Handles MyBase.FormClosed Console.WriteLine("FormClosed") End Sub
//Button1のClickイベントハンドラ private void Button1_Click(object sender, System.EventArgs e) { Application.Exit(); Console.WriteLine("Exit"); } //フォームのFormClosedイベントハンドラ private void Form1_FormClosed(object sender, FormClosedEventArgs e) { Console.WriteLine("FormClosed"); }
Application.Exitメソッドでは、アプリケーションが終了できないケースが多々あります。例えば、FormClosingイベントでフォームを閉じるのが拒否(キャンセル)された時(詳しくは、「条件によりフォームが閉じられないようにする」)、アプリケーションは終了しません。また、フォアグラウンドスレッド(Thread.IsBackgroundプロパティがFalseのスレッド)が実行中の場合は、これが終了しないとアプリケーションも終了しません。
フォームを閉じるのがキャンセルされたかは、Application.Exitメソッドに引数としてCancelEventArgsオブジェクトを渡すと、そのCancelプロパティの値で知ることができます。この機能は、.NET Framework 2.0以降で有効です。
以下の例では、Application.Exitでアプリケーションを終了させる時、キャンセルされたかを調べています。また、フォームのFormClosingイベントハンドラを使って、Application.Exitでアプリケーションを終了させようとした時はフォームを閉じずにキャンセルするようにしています。
'Button1のClickイベントハンドラ Private Sub Button1_Click(sender As Object, e As EventArgs) _ Handles Button1.Click 'CancelEventArgsオブジェクトの作成 Dim cea As New System.ComponentModel.CancelEventArgs() 'アプリケーション終了 Application.Exit(cea) 'アプリケーションの終了がキャンセルされたか調べる If cea.Cancel Then Console.WriteLine("キャンセルされました") End If End Sub 'フォームのFormClosingイベントハンドラ Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) _ Handles MyBase.FormClosing 'Application.Exitではアプリケーションを終了できないようにする If e.CloseReason = CloseReason.ApplicationExitCall Then e.Cancel = True End If End Sub
//Button1のClickイベントハンドラ private void Button1_Click(object sender, EventArgs e) { //CancelEventArgsオブジェクトの作成 System.ComponentModel.CancelEventArgs cea = new System.ComponentModel.CancelEventArgs(); //アプリケーション終了 Application.Exit(cea); //アプリケーションの終了がキャンセルされたか調べる if (cea.Cancel) { Console.WriteLine("キャンセルされました"); } } //フォームのFormClosingイベントハンドラ private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //Application.Exitではアプリケーションを終了できないようにする if (e.CloseReason == CloseReason.ApplicationExitCall) { e.Cancel = true; } }
当たり前のことですが、エントリポイントのメソッド(通常は、Mainメソッド)が終了すると、プログラムが終了します(エントリポイントについて詳しくは、「アプリケーションのエントリポイントを自作する」をご覧ください)。前述した方法も、結局はMainメソッドが終了してアプリケーションが終了しています。
コンソールアプリケーションの場合は、Mainメソッドを最後まで実行させたり、Returnで抜けることで、アプリケーションを終わらせるのが一般的でしょう。
コンソールアプリケーションの場合は、Environment.Exitメソッドでアプリケーションを終了させることもできます。Environment.Exitメソッドは、プロセスを終了させて、指定された終了コードをオペレーティングシステムに渡します。
補足:VB.NETのEndステートメントは、Openステートメントで開いているファイルを閉じてから、Environment.Exit(0)を呼び出しています。
'アプリケーションを終了し、終了コードとして0を渡す Environment.Exit(0) '次のようにしても同じ End
//アプリケーションを終了し、終了コードとして0を渡す
Environment.Exit(0);
WindowフォームアプリケーションでもEnvironment.Exitメソッドは使用できますが、プロセスを強制的に終了するため、それ以降のコードが実行されません。つまり、フォームのFormClosingイベントやFormClosedイベントはもちろん、ファイナライザなども呼び出されません。アプリケーションを正常に終了させるのであれば、使わない方が良いです。
Environment.FailFastメソッドを使うと、アプリケーションを強制的に終了させることができます。アプリケーションの状態が悪化し、すぐに強制終了させたい時に使用します。それ以外では、使用すべきではありません。このメソッドは、.NET Framework 2.0以降で使用できます。
このメソッドは、指定されたメッセージをイベントログに書き込んでから、プロセスを終了させます。
このメソッドを呼び出すと、FatalExecutionEngineErrorが発生します。詳しくは、「Environment.FailFast: FatalExecutionEngineError was detected | Microsoft Connect」をご覧ください。
'イベントログに書き込んで、アプリケーションを直ちに終了する
Environment.FailFast("FailFastのテストです")
//イベントログに書き込んで、アプリケーションを直ちに終了する
Environment.FailFast("FailFastのテストです");
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。