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

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

  1. 使用MUTEX: 接受此SO问题的答案

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

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

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

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

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

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

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

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

为什么没有人提到勾选此复选框 ?

在此处输入图像描述

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