3

我正在使用带有 C# 的 .NET。

我想阻止同一可执行文件的两个实例同时运行,但我不想阻止从另一个文件夹运行的同一进程。

例如,我有一个位于两个不同位置的可执行文件:

  • C:\MyProject\Master\Program.exe

  • C:\MyProject\Slave\Program.exe

这些是相同的 .exe 文件,但位于两个不同的位置。

我想允许一个从主文件夹运行的 Program.exe 实例和一个从从文件夹运行的实例,但没有两个实例。

我试图通过检查具有相同名称(Process.GetProcessesByName)的进程数来做到这一点,但是我无法区分两者。

我发现最接近的是从流程中获取模块。

列表中的第一个是 exe 的 ProcessModule。但我不确定这是否永远是列表中的第一个。对此有任何保证,还是对解释的问题有更好的解决方案?

4

2 回答 2

1

我会使用全局互斥锁而不是依赖程序集名称。例如,另一个应用程序可能正在使用相同的文件名。

参见例如这个答案: Run single instance of an application using Mutex

于 2012-05-07T10:54:56.657 回答
0

一种方法是,通过另一项服务,可能会执行以下操作:

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

将为您提供程序的所有活动进程。

然后您可以从中获取目录:

string fullPath = process.MainModule.FileName;

比较所有实例的目录,如果两个具有相同的文件夹,则关闭其中一个。

于 2012-05-07T10:17:12.350 回答