最近仕事でC#を使用しているのですが、
久々に使うこともあり、忘れていることばかりです。
まあ、その都度調べていることが多いのですが、
せっかくなので、そういう内容を記事にして間を持たせていきたい。
今回は、C#アプリケーションの多重起動禁止について。
多重起動禁止のアプリケーションの必要性
ファイル書き込みとか、通信を行うアプリケーションの場合、
複数起動していて、複数のアプリケーションから同時にアクセスしたりすると
構造上不味い場合があります。
こういったときに、複数同時にアクセスが行われたときに大丈夫なように作るよりも、
そもそも、複数起動できないようにした方が、楽です。
(身も蓋もない話)
ケースの確認がさ、大変なんだよね。
そもそも、タイミングとかで大丈夫なケースが出てきたりするし。
そんなら、動かなくしちゃいましょうね~という話。
多重起動禁止のやり方
プログラム起動時に一番初めに実行される
Program.csのMain関数に手を入れていきます。
フォームアプリケーションでプロジェクト作成していると、
あんまり触らない部分かもしれないですね。
メイン関数の中身は、はじめこんな感じだと思います。
// アプリケーション開始Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new MainForm());
このままだと、MainFormが起動して普通に動作してしまうので、
前の部分に多重起動の禁止処理を追加していきます。
処理の内容としては、起動する際に特定の名前で
ミューテックスハンドラというものを取得しておいて
既に取得されていると取得に失敗するので、それを判断して
「2つ以上同時にアプリケーションを起動できなくしましょう」
という形で実装します。
下記のような形にします。
少し長いですが、割と出番が多いので、自分用に。
// ミューテックスハンドラの取得string mutex_name = "XXXXXX"; // ミューテックスハンドラ名前System.Threading.Mutex mutex = new System.Threading.Mutex( false, mutex_name );bool handle = false;try{// ミューテックスハンドラの取得try{handle = mutex.WaitOne(0, false);}catch( System.Threading.AbandonedMutexException ){handle = true;}// ミューテックスハンドラの取得に失敗した場合// すでに同じアプリケーションが起動しているので、多重起動禁止するif (handle == false ){// ミューテックス所有権が得られなかった場合、多重起動状態にある// エラーメッセージを表示して、処理を終了する。MessageBox.Show("このアプリケーションは多重起動することはできません。");return;}// アプリケーションを開始するApplication.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new MainForm());}finally{// アプリケーション終了時処理// 起動時に取得したミューテックスハンドラを開放するif (handle){mutex.ReleaseMutex();}mutex.Close();}
既にアプリケーションが起動していて、さらにもう一つ起動しようとした場合は、
新たにミューテックスハンドラを取得することができないので、
エラーメッセージを表示して起動できずに終了します。
既に起動していたアプリケーションを終了させれば、
ミューテックスハンドラは取得できるようになるため、
アプリケーションを起動できるようになります。
結果として、起動できるのは常に1つまで、となりますね!
ではでは
0 件のコメント:
コメントを投稿