2

假设我有一个用 C# 编写的名为 EquipCtrl.exe 的应用程序,它作为 PC 上的本地进程运行以控制一台设备。

显然,我希望每台 PC 上只运行一个 Equipctrl 实例。如果我有两个设备可以控制每台 PC,那么我会将其限制为每台 PC 两个实例。

我所做的方式是 1. 进程名称之一。我将进程命名为 EqCtrl,在进程启动时,它会计算名称为“EqCtrl”的进程数。2. 执行名称。在启动时计算执行名称为 EquipCtrl.exe 的进程数。3. 登记记录。4. SQL Server 数据库记录。

对我来说,进程名称或执行名称检测是最简单的,也是我经常(如果不是全部)做的最多的事情。但是,它们容易受到名称冲突的影响。即使我进一步找出执行路径,也可以通过将执行文件复制到另一个文件夹来规避限制。

在 .NET 上执行执行限制的最佳方法是什么?为什么?注册表记录是最好的方法吗?

4

4 回答 4

7

尝试系统范围的信号量:http: //msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

于 2010-11-11T22:04:00.197 回答
1

Scott Hanselman 的博客在这方面有一篇很棒的文章……

http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx

于 2010-11-11T22:18:15.853 回答
0

您可以通过计算命名互斥量\信号量来执行此操作,同时确保您创建的互斥量/信号量前缀以 GLOBAL\ 和 LOCAL\ 开头,否则远程桌面连接将不会读取这些命名互斥量并且计数将丢失。

http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx

于 2010-11-12T08:04:05.047 回答
0

嗯..当我们只想允许应用程序的单个实例时,我们使用命名互斥锁

这并不能完全实现您想要的场景。

还有一点,为了避免冲突,除了可执行文件名和目录,还要使用可执行文件的 MD5 哈希。

于 2010-11-11T22:07:11.240 回答