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

Mar*_*arc 10 .net c# mutex single-instance

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

有没有办法创建一个机器范围的互斥锁,还是有任何其他解决方案来实现每个机器应用程序的单个实例?

ste*_*ell 14

我会使用全局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);
Run Code Online (Sandbox Code Playgroud)

bFirstInstance如果这是全局运行的应用程序的第一个实例,则返回where .如果您省略了互斥锁的全局部分或将其替换为本地,那么互斥锁将仅针对每个会话(这可能是您当前代码的工作原理).

我相信我首先从Jon Skeet那里获得了这项技术.

Mutex对象上的MSDN主题解释了Mutex对象的两个范围,并重点介绍了在使用终端服务时这一点很重要的原因(请参阅倒数第二个).