Рекомендуемый способ сделать это с помощью системы взаимной блокировки.
bool createdNew;
using(var mutex = new System.Threading.Mutex(true, "MyAppName", out createdNew))
{
if (createdNew)
// first instance
Application.Run();
else
MessageBox.Show("There is already an instace running");
}
Первый параметр мьютекс CTOR говорит это, чтобы дать создать общесистемный семафор для этого потока. Если Mutex уже существует, он возвращает false
через третий параметр.
Обновление
Куда это положить? Я бы поместил это в program.cs. Если вы поместите его в form_load, вам нужно сохранить мьютекс на время жизни приложения (иметь мьютекс в качестве члена в форме) и вручную отпустить его в форме разгрузки.
Чем раньше вы это называете, тем лучше, прежде чем другое приложение откроет соединения с БД и т. Д. И до того, как будут созданы ресурсы для форм/контролей и т. Д.
Дубликат http://stackoverflow.com/questions/3211529/net-4-single-application-instance –