所以,我能够在Windows上执行我的应用程序的单个实例。
[STAThread]
class method Program.Main(args: array of string);
begin
var mutex := new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
if mutex.WaitOne(Timespan.Zero, true) then
begin
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += OnThreadException;
lMainForm := new MainForm;
lMainForm.ShowInTaskbar := true;
lMainForm.Visible := false;
Application.Run(lMainForm);
end
else
MessageBox.Show("Another copy running!!!");
end;
但是,在Mono下在Linux上运行相同的应用程序该代码根本不起作用。我可以运行多个副本。我不知道这是否与我正在像mono MyPro.exe
一样在终端上启动应用程序。如果这是问题,是否需要在执行命令行之前传递一些值。
预先感谢
您需要在单声道中启用共享内存,因为Adrian Faciu提到了使您的方法起作用,但是这不是最好的方法(这是默认情况下默认情况下的原因,即使我现在不记得确切的原因)
过去我使用了两种解决方案:
-
基于文件的锁。创建一个已知文件,将PID写入该文件。在您的应用程序中的启动时,请检查文件是否存在,以及是否存在读取PID并检查是否存在该PID的任何运行过程(以便可以从崩溃中恢复)。并在退出时删除文件(如果首先创建该文件)。缺点是,如果几乎同时启动了几个实例,则在启动时有种族条件。您可以通过文件锁定进行改进,但是您可能必须使用P/Invokes在Linux上进行适当的文件锁定(我不确定托管API会做您期望的事情)。
-
基于袜子的锁。打开一个已知端口。优于上述的优点是您不需要进行任何清理,也没有种族条件。缺点是您需要一个固定/已知端口,并且可能同时使用其他程序。
您可能需要使用mono_enable_shm环境变量启用共享的把手:
MONO_ENABLE_SHM=1 mono MyPro.exe
阿德里安的解决方案对我有用(TM)。狂野的猜测:您是否需要中的Mono_enable_shm