17

我在 StackOverflow 上看到了至少三种不同的方法来实现这一点。

  1. Using a MUTEX: Accepted answer to this SO question

  2. 使用 Microsoft.VisualBasic 库的 WindowsFormsApplicationBase:此 SO 问题的第二高投票答案

  3. 使用 Process.GetProcessNames 检查您的应用程序是否正在运行:此处的方法已发布为对此SO 问题的答案

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

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

4

3 回答 3

17

如有疑问,请始终首选 .NET 框架中包含的实现。您可以期望这样的实现已经过数十万程序员的测试,经过仔细审查的安全性和可用性,并将在未来几年内得到维护。

互斥锁方法很容易上手。然而,它存在一个相当严重的安全问题。拒绝服务攻击很容易上手,您不能将互斥锁的名称保密,任何人都可以轻松创建同名互斥锁并阻止您的程序启动。

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

WindowsFormsApplicationBase 在 C# 程序员眼中存在图像问题。他们对命名空间名称感到窒息,并认为他们的程序会以某种方式感染 vb-isms。这是胡说八道,它只是一个可以在任何语言中使用的普通 .NET 类。

于 2012-12-31T19:16:37.200 回答
5

为什么没有人提到勾选这个复选框

在此处输入图像描述

于 2012-12-31T19:56:21.030 回答
0

这真的是一个品味问题,但我喜欢这种Mutex方法,仅仅是因为它不需要依赖于 VisualBasic 库,并且 usingProcess.GetProcessNames是一个非理想的解决方案(如前所述,进程名称并不总是会映射到你的认为他们可能)

于 2012-12-31T19:13:35.790 回答