正确的.NET方式来实现单个实例应用程序

时间:2012-12-31 18:32:42

标签: c# .net single-instance

我已经在StackOverflow上看到至少三种不同的方法来实现这一目标。

  1. 使用MUTEX:Accepted answer to this SO question

  2. 使用Microsoft.VisualBasic库的WindowsFormsApplicationBase:Second highest voted answer to this SO question

  3. 使用Process.GetProcessNames检查您的应用程序是否正在运行:Method here已作为此SO question的答案

  4. 发布

    我确信还有更多方法可以做到这一点。

    我只是想知道其中一个是否是首选的,如果我选择“错误的”,可能会产生什么后果。

3 个答案:

答案 0 :(得分:17)

如果有疑问,总是更喜欢.NET框架中包含的实现。您可以高度期望这样的实现已经被成千上万的程序员测试,已经过安全性和可用性的仔细审查,并将在未来几年内得到维护。

互斥方法很容易实现。然而,它遭受了非常严重的安全问题。 拒绝服务攻击非常简单,你无法保密互斥锁的名称,任何人都可以轻而易举地创建一个具有相同名称的互斥锁,并阻止你的程序启动。< / p>

由于同样的原因,流程名称方法存在严重缺陷。无法保证进程名称是唯一的。不仅易于开发,而且容易被意外触发。

WindowsFormsApplicationBase在C#程序员眼中存在图像问题。他们扼杀命名空间名称,并假设他们的程序会以某种方式感染vb-isms。这是无稽之谈,它只是一个可用于任何语言的普通.NET类。

答案 1 :(得分:5)

为什么没有人提到勾选this checkbox

enter image description here

答案 2 :(得分:0)

这真的是一个品味问题,但我赞成Mutex方法,因为它不需要依赖VisualBasic库,并且使用Process.GetProcessNames是一个非理想的解决方案(如上所述) ,流程名称并不总是映射到你认为它们可能的位置