DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

アプリケーション(自分自身)を終了させる

ここでは、Windowsフォームアプリケーションやコンソールアプリケーションで、自分自身のアプリケーション(あるいは、プログラム、プロセス)を終了させる方法について説明します。

なお外部のアプリケーションを終了させる方法は、「プロセスを強制的に終了する」で説明しています。

メインフォームを閉じる

Windowsフォームアプリケーションの場合は、通常は、メインフォーム(メインウィンドウ)を閉じるとアプリケーションが終了します。

メインフォームとは、スプラッシュウィンドウなど一時的に表示されるフォームを除き、通常一番初めに表示されるフォームです。もっと具体的に言えば、アプリケーション開始時にApplication.Runメソッドに引数として渡したフォーム(VB.NETでは、スタートアップフォームに指定したフォーム)のことです。詳しくは、「フォームを連続して表示する」の「メインフォームを入れ替える」をご覧ください。

フォームを閉じるには、Form.Closeメソッドを使います。詳しくは、「フォームを閉じる」で説明しています。

VB.NET
コードを隠すコードを選択
'自分自身のフォームがメインフォームの時、
'自分自身のフォームをCloseメソッドで閉じると、アプリケーションが終了する
Me.Close()
C#
コードを隠すコードを選択
//自分自身のフォームがメインフォームの時、
//自分自身のフォームをCloseメソッドで閉じると、アプリケーションが終了する
this.Close();

Application.Exitメソッドを使用する

Windowsフォームアプリケーションで、メインフォームが分からない、存在しないなどの場合は、Application.Exitメソッドでアプリケーションを終了させることもできます。

補足:Application.Exitメソッドは、Application.Runメソッドで開始されたメッセージループを終了させるために使用されます。つまり、このメソッドはRunメソッドを返します。Application.Exitメソッドはすべてのスレッドで実行中のメッセージループを終了させますが、現在のスレッドのメッセージループだけを終了するには、Application.ExitThreadメソッドを使用します。
VB.NET
コードを隠すコードを選択
'Imports System.Windows.Forms

'アプリケーションを終了する
Application.Exit()
C#
コードを隠すコードを選択
//using System.Windows.Forms;

//アプリケーションを終了する
Application.Exit();

Application.Exitメソッドを呼び出しても、すぐにアプリケーションが終了する訳ではありません。Application.Exitメソッドを呼び出すと、現在開いているすべてのフォームを閉じようとします。この時、.NET Framework 2.0以降では、フォームのFormClosingイベントとFormClosedイベントが発生します。しかし、ClosingイベントとClosedイベントは発生しません。さらに、Application.Exitメソッドの後にコードが続いている場合は、それが実行されます。

例えば以下のようなコードでButton1をクリックすると、出力ウィンドウには「FormClosed」の後で「Exit」と表示され、アプリケーションが終了します。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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でアプリケーションを終了させようとした時はフォームを閉じずにキャンセルするようにしています。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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メソッドでアプリケーションを終了させることもできます。Environment.Exitメソッドは、プロセスを終了させて、指定された終了コードをオペレーティングシステムに渡します。

補足:VB.NETのEndステートメントは、Openステートメントで開いているファイルを閉じてから、Environment.Exit(0)を呼び出しています。
VB.NET
コードを隠すコードを選択
'アプリケーションを終了し、終了コードとして0を渡す
Environment.Exit(0)

'次のようにしても同じ
End
C#
コードを隠すコードを選択
//アプリケーションを終了し、終了コードとして0を渡す
Environment.Exit(0);

WindowフォームアプリケーションでもEnvironment.Exitメソッドは使用できますが、プロセスを強制的に終了するため、それ以降のコードが実行されません。つまり、フォームのFormClosingイベントやFormClosedイベントはもちろん、ファイナライザなども呼び出されません。アプリケーションを正常に終了させるのであれば、使わない方が良いです。

Environment.FailFastメソッドで強制的に終了させる

Environment.FailFastメソッドを使うと、アプリケーションを強制的に終了させることができます。アプリケーションの状態が悪化し、すぐに強制終了させたい時に使用します。それ以外では、使用すべきではありません。このメソッドは、.NET Framework 2.0以降で使用できます。

このメソッドは、指定されたメッセージをイベントログに書き込んでから、プロセスを終了させます。

このメソッドを呼び出すと、FatalExecutionEngineErrorが発生します。詳しくは、「Environment.FailFast: FatalExecutionEngineError was detected | Microsoft Connect」をご覧ください。

VB.NET
コードを隠すコードを選択
'イベントログに書き込んで、アプリケーションを直ちに終了する
Environment.FailFast("FailFastのテストです")
C#
コードを隠すコードを選択
//イベントログに書き込んで、アプリケーションを直ちに終了する
Environment.FailFast("FailFastのテストです");

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。