Restrict multiple instances of an application

The common technique for this is to create a named Mutex and check for its presence on application start.

See this or this.

Code from DDJ:

class App : Form
{
    Mutex mutex;

    App()
    {
        Text = "Single Instance!";
        mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX");
        if (!mutex.WaitOne(0, false)) 
        {
            mutex.Close();
            mutex = null;
        }
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            mutex.ReleaseMutex();
        base.Dispose(disposing);
    }

    static void Main()
    {
        App app = new App();
        if (app.mutex != null) Application.Run(app);
        else MessageBox.Show("Instance already running");
    }
}

i solved this problem by this

[STAThread]
 static void Main()
    {

        Process[] result = Process.GetProcessesByName("ApplicationName");
        if (result.Length > 1)
        {
            MessageBox.Show("There is already a instance running.", "Information");
            System.Environment.Exit(0);
        }
        // here normal start 
    }

it is simple, but i had hardly time to check for better solutions.


With thanks to Messrs. Allen and Powell:

static void Main() 
{
    using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) {
        if (!mutex.WaitOne(0, false)) {
            string processName = GetProcessName();
            BringOldInstanceToFront(processName);
        }
        else {
            GC.Collect();
            Application.Run(new Voting());
        }
    }
}

private static void BringOldInstanceToFront(string processName) {
    Process[] RunningProcesses = Process.GetProcessesByName(processName);
    if (RunningProcesses.Length > 0) {
        Process runningProcess = RunningProcesses[0];
        if (runningProcess != null) {
            IntPtr mainWindowHandle = runningProcess.MainWindowHandle;
            NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED);
        NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE);
        }
    }
}