我已经在StackOverflow上看到至少三种不同的方法来实现这一目标。
使用Microsoft.VisualBasic库的WindowsFormsApplicationBase:Second highest voted answer to this SO question
使用Process.GetProcessNames检查您的应用程序是否正在运行:Method here已作为此SO question的答案
我确信还有更多方法可以做到这一点。
我只是想知道其中一个是否是首选的,如果我选择“错误的”,可能会产生什么后果。
答案 0 :(得分:17)
如果有疑问,总是更喜欢.NET框架中包含的实现。您可以高度期望这样的实现已经被成千上万的程序员测试,已经过安全性和可用性的仔细审查,并将在未来几年内得到维护。
互斥方法很容易实现。然而,它遭受了非常严重的安全问题。 拒绝服务攻击非常简单,你无法保密互斥锁的名称,任何人都可以轻而易举地创建一个具有相同名称的互斥锁,并阻止你的程序启动。< / p>
由于同样的原因,流程名称方法存在严重缺陷。无法保证进程名称是唯一的。不仅易于开发,而且容易被意外触发。
WindowsFormsApplicationBase在C#程序员眼中存在图像问题。他们扼杀命名空间名称,并假设他们的程序会以某种方式感染vb-isms。这是无稽之谈,它只是一个可用于任何语言的普通.NET类。
答案 1 :(得分:5)
为什么没有人提到勾选this checkbox?
答案 2 :(得分:0)
这真的是一个品味问题,但我赞成Mutex
方法,因为它不需要依赖VisualBasic库,并且使用Process.GetProcessNames
是一个非理想的解决方案(如上所述) ,流程名称并不总是映射到你认为它们可能的位置