WPFアプリケーションで二重起動を防ぐ方法

最近WPFを使ったアプリケーションを作ってますが、まだまだ情報が少なくて調べ物が大変です。
二重起動を防ぐ方法がなかなか分からず大変だったので、忘れないうちにメモしておきます。

Windowsフォームアプリケーションだとこんな感じ。

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        private static System.Threading.Mutex mutex;

        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            /* 名前を指定してMutexを生成 */
            mutex = new System.Threading.Mutex(false, "Mutex名をここに入れる");

            /* 二重起動をチェック */
            if (mutex.WaitOne(0, false))
            {
                /* アプリケーションを実行 */
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());

                /* Mutexを解放 */
                mutex.ReleaseMutex();
            }
            else 
            {
                /* 二重起動の場合はエラーを表示して終了 */
                MessageBox.Show("すでに起動されています");
            }

            /* Mutexを破棄 */
            mutex.Close();
        }
    }
}


WPFアプリケーションの場合、Mainメソッドがパーシャルクラスで自動生成されるので同じような書き方ができません。
これをWPFで書く場合、App.xamlにSystem.Windows.ApplicationクラスのStartupとExitのイベントハンドラを宣言して、

<Application x:Class="WpfApplication1.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml" Startup="Application_Startup" Exit="Application_Exit">
    <Application.Resources>
    </Application.Resources>
</Application>


App.xaml.csに、アプリケーション起動前にする処理をStartupイベントに、起動後にする処理をExitイベントに実装します。

using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// App.xaml の相互作用ロジック
    /// </summary>
    public partial class App : Application
    {
        private static System.Threading.Mutex mutex;

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            /* 名前を指定してMutexを生成 */
            mutex = new System.Threading.Mutex(false, "Mutex名をここに入れる");

            /* 二重起動をチェック */
            if (!mutex.WaitOne(0, false))
            {
                /* 二重起動の場合はエラーを表示して終了 */
                MessageBox.Show("すでに起動されています");

                /* Mutexを破棄 */
                mutex.Close();
                mutex = null;

                /* 起動を中止してプログラムを終了 */
                this.Shutdown();
            }
        }

        private void Application_Exit(object sender, ExitEventArgs e)
        {
            if (mutex != null)
            {
                /* Mutexを解放 */
                mutex.ReleaseMutex();

                /* Mutexを破棄 */
                mutex.Close();
            }
        }
    }
}

これで、最初のWindowsフォームアプリケーションのように、二重起動を防ぐことができます。