就目前而言,这个问题不适合我们的问答形式。我们希望答案能得到事实、参考资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或广泛的讨论。如果您认为这个问题可以改进,并可能重新开放,请visit the help center寻求指导。
十年前就关门了。
我在StackOverflow上看到过至少三种不同的方法来实现这一点。
1.使用MUTEX:Accepted answer to this SO question
1.使用Microsoft.VisualBasic库的WindowsFormsApplicationBase:此SO问题的第二高投票答案
1.使用Process.GetProcessNames检查应用程序是否正在运行:Method here已作为此SO question的答案发布
我相信还有更多的方法可以做到这一点。
我只是想知道,如果其中一个是首选,什么后果可能是如果我选择了“错误”的一个。
3条答案
按热度按时间a64a0gku1#
当有疑问时,* 总是 * 更喜欢包含在.NET框架中的实现。您可以对这样的实现抱有很高的期望,因为这样的实现已经过数十万程序员的测试,已经过仔细的安全性和可用性审查,并且将在未来几年内得到维护。
互斥方法是一种很容易实现的方法。然而,它有一个相当严重的安全问题。拒绝服务攻击很容易实现,你不能把你的互斥对象的名字保密,任何人都可以用相同的名字创建一个互斥对象,阻止你的程序启动。
由于同样的原因,进程名方法也有很大的缺陷。不能保证进程名是唯一的。不仅容易被利用,而且容易被意外触发。
最后但并非最不重要的是,它有一个很难自己实现的功能。StartupNextInstance事件可用于检测用户再次启动您的应用。该事件的默认实现会自动激活正在运行的示例的主窗口,很好。实现您自己的以解析命令行参数。
WindowsFormsApplicationBase在C#程序员眼中有一个图像问题。他们在命名空间名称上窒息,并认为他们的程序会以某种方式感染vb-isms。这是无稽之谈,它只是一个普通的.NET类,可以在任何语言中使用。
bfnvny8b2#
为什么没人提到滴答声this checkbox?
的数据
oxf4rvwz3#
这确实是一个品味问题,但我更喜欢
Mutex
方法,因为它不需要依赖VisualBasic库,并且使用Process.GetProcessNames
是一个非理想的解决方案(如前所述,进程名称并不总是Map到您认为它们可能Map的位置)