アプリケーションの二重起動を防止する

アプリケーションの二重起動を防止するには、いくつかの方法があります。ここでは、Mutexを使った方法と ProcessNameを使った方法を記録します。

二重起動の防止をクラスライブラリに実装し開発を行う場合、ホスティングプロセス及びdevenv.exeが 動作することで二重起動と判定されます。

ホスティングプロセスとは、アセンブリ.vshost.exeで実行されデバッグ作業を強化するためVisual Studio 2005 で追加された機能です。この機能を使用しないようにするには、プロジェクトのプロパティからデバッグタブを クリックします。そのタブにある「VisualStudio ホスティングプロセスを有効にする」のチェックをはずすことで ホスティングプロセスが停止します。

暫定ですが、AppDomain.CurrentDomain.FriendlyNameを使うことでも回避できそうです。

Mutexを使った二重起動の防止

アプリケーションの起動時にミューテックスオブジェクトが存在するかどうか確認します。 System.Threading.Mutex(False, "UniqueName")でユニークな識別名を設定し hMutex.WaitOne(0, False)で、すでに起動中であるかを確認します。

GC.KeepAliveは、GCによってミューテックスオブジェクトが破棄されてしまうのを防ぐため指定します。

Dim hMutex As New System.Threading.Mutex(False, "ユニークな識別名")

If hMutex.WaitOne(0, False) = True Then
    GC.KeepAlive(hMutex)
'    Application.Run(New Form1)
Else
    Application.Exit()
End If

プロセス名をを使った二重起動の防止

GetCurrentProcess.ProcessNameで、プロセス名を取得しProcess.GetProcessesByNameで 同じ実行可能ファイルを実行しているプロセス型の配列を取得します。この配列から すでに起動中であるかを確認します。

If UBound(Diagnostics.Process.GetProcessesByName( _
    Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0 Then
    ' すでに起動中
    Application.Exit()
End If