如何实现每台机器应用程序的单个实例?

我必须限制我的.net 4 WPF应用程序,以便每台机器只能运行一次。 请注意,我说每台机器,而不是每个会话。
我直到现在都使用一个简单的互斥体实现了单实例应用程序,但不幸的是,这样的互斥体是每个会话。

有没有办法创建一台机器宽互斥或有没有其他解决方案来实现每台机器应用程序的单个实例?


我会用一个全局的Mutex对象来完成这个工作,这个对象必须在你的应用程序中保存下来。

MutexSecurity oMutexSecurity;

//Set the security object
oMutexSecurity = new MutexSecurity();
oMutexSecurity.AddAccessRule(new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null), MutexRights.FullControl, AccessControlType.Allow));

//Create the global mutex and set its security
moGlobalMutex = new Mutex(True, "Global{5076d41c-a40a-4f4d-9eed-bf274a5bedcb}", bFirstInstance);
moGlobalMutex.SetAccessControl(oMutexSecurity);

如果这是全局运行的应用程序的第一个实例,则返回bFirstInstance 。 如果您忽略互斥体的全局部分或将其替换为本地,则该互斥体将仅在每个会话中进行(这是您当前代码的工作原理)。

我相信我首先从Jon Skeet得到这种技术。

关于Mutex对象的MSDN主题解释了Mutex对象的两个范围,并强调了在使用终端服务时这很重要的原因(请参阅倒数第二个注释)。


我认为你需要做的是使用系统sempahore来跟踪你的应用程序的实例。

如果使用接受名称的构造函数创建Semaphore对象,则该对象与该名称的操作系统信号相关联。

命名系统信号在整个操作系统中都是可见的,并且可以用来同步进程的活动。

编辑:请注意,我不知道,如果这种方法跨机器上的多个Windows会话。 我认为它应该作为一个操作系统级别的构造,但我不能肯定地说,因为我没有这样测试过。

编辑2:我不知道这一点,但在阅读Stevo2000的答案后,我做了一些查找,我认为使全局名称空间适用对象的“全局”前缀将适用于信号量以及信号量,如果以这种方式创建,应该可以工作


您可以在%PROGRAMDATA%的某处打开一个具有独占权限的文件。第二个启动的实例将尝试打开相同的文件,如果它已经打开,则会失败。

链接地址: http://www.djcxy.com/p/9053.html

上一篇: How to implement single instance per machine application?

下一篇: Launch single console application