the second method is the best i've found. just get over the fact it uses Microsoft.VisualBasic DLL and it does everything else you need - including proper use of .NET remoting (no sockets or mutexes to create yourself). but best of all it makes it easy to pass parameters to the already running application, or simply bring it to the front when you try to reopen it