2012-05-07 5 views
3

Я использую .NET с C#.Предотвращение нескольких экземпляров процесса одного исполняемого файла

Я хочу, чтобы оба экземпляра одного и того же исполняемого файла выполнялись одновременно, но я не хочу, чтобы один и тот же процесс запускался из другой папки.

Например, у меня есть исполняемый файл, который находится в двух разных местах:

  • C: \ MyProject \ Master \ Program.exe

  • C: \ MyProject \ работорговли \ program.exe

Это то же самое .exe-файл, но в двух разных местах.

Я хочу, чтобы один экземпляр программы Program.exe запускался из основной папки и одного экземпляра из папки Slave, но ни одного из них не было.

Я попытался сделать это, проверив количество процессов с тем же именем (Process.GetProcessesByName), но тогда я не могу отличить их.

Ближайший я нашел, чтобы получить модули из процесса.

Первый в списке ProcessModule exe. Но я не уверен, будет ли это всегда первым в списке. Есть ли какая-либо гарантия для этого, или есть лучшее решение этой проблемы?

+1

Я фактически проголосовал, чтобы закрыть это как дубликат [этого] (http://stackoverflow.com/questions/819773/run-single-instance-of-an-application-using-mutex), когда я понял, что вам нюансы. Сожалею. Тем не менее, вы все равно можете следовать этому подходу, но закодируйте полное имя пути в имени мьютекса, таким образом, предоставляя экземпляр для каждого каталога. –

+0

Нет проблем. Я даже не знаю, достаточно ли объяснений. :) –

ответ

1

Один из способов сделать это, другой службой, может быть, сделать что-то вроде этого:

Process[] processes = Process.GetProcessesByName("Program"); 

даст вам все активные процессы вашей программы.

, то вы можете получить каталог от этого:

string fullPath = process.MainModule.FileName; 

Сравнить каталоги всех экземпляров, и если два имеет ту же папку, закрыть один из них.

+0

Являются ли модули [0] всегда исполняемым модулем процесса? Можно ли это гарантировать? –

+0

вы также можете использовать: System.AppDomain.CurrentDomain.FriendlyName , чтобы иметь текущее имя exe –

+0

Я отредактировал его, а не модули [0] - MainModule. – Mithir

1

Я бы использовал глобальный мьютекс вместо того, чтобы полагаться на имя сборки. Например, другое приложение может использовать одно и то же имя файла.

См., Например, этот ответ: Run single instance of an application using Mutex

Смежные вопросы