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

Mic*_*kus 17 .net c# single-instance

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

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

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

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

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

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

Han*_*ant 17

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

互斥方法很容易实现.然而,它遭受了非常严重的安全问题.一个拒绝服务攻击是非常简单的走了,你不能让你的互斥秘密和任何人的名字可以平凡创建具有相同名称的互斥体,防止你的程序不断启动.

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

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

  • 例如,简单地使用SysInternals的WinObj实用程序. (2认同)
  • 更重要的问题是为什么有人会攻击你的申请?如果他们想要启动多个实例,则不要阻止它启动. (2认同)

Neo*_*isk 5

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

在此输入图像描述

  • Cuz只适用于VB应用程序 - 在引擎盖下它依赖于前面提到的VisualBasic表单应用程序DLL. (4认同)
  • @JerKimball:有意思......`WindowsFormsApplicationBase`你的意思?看起来C#在易用性方面存在缺陷.知道为什么微软会让它变得复杂,如果真的那么简单,那将会很有趣.而且不仅仅是在这个功能.但是感谢你的抬头! (2认同)