Рекомендованный способ сделать это с системным мьютексом.
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");
}
Первый параметр для Mutex ctor указывает ему создать системный мьютекс для этого потока. Если Mutex уже существует, он вернет false
через 3-й параметр.
Обновление
Куда это положить?
Я бы положил это в program.cs. Если вы поместите его в form_load, вам нужно будет сохранить мьютекс на время жизни приложения (иметь мьютекс в качестве члена в форме) и вручную освободить его в форме unload.
Чем раньше вы это называете, тем лучше, прежде чем другое приложение откроет соединения с БД и т. Д., И до того, как будут созданы ресурсы для форм / элементов управления и т. Д.