如何确定某个位置的.NET应用程序实例是否正在运行?

我需要禁止一个应用程序,如果它从相同的文件夹开始,但允许它,如果相同的应用程序从其他文件夹运行。

问题是当应用程序closures它变得不可见,但仍然在内存中,因为它终止了一些内部工作。

当旧实例仍然在内存中终止时,用户很可能会很快从同一个文件夹再次启动该应用程序。

但从另一方面来说,如果这个应用程序从其他文件夹运行,应该是可能的。

任何线索如何在C#中做到这一点?


更新:

1

事实上,应用程序将一些日志写入子目录中的本地文件,并写入本地数据库文件中。 所以很可能两个实例之间会有一些冲突。

2

Guid appGuid = Guid.Parse("305BACEA-4074-11E1-85E1-066E4854019B"); public MainWindow() { InitializeComponent(); using (Mutex mutex = new Mutex(false, @"Global\" + appGuid) ) { if (!mutex.WaitOne(0, false)) { // MessageBox.Show("Instance already running"); // Somehow here I have to get the path of the running instance. // If the path the same as the current instance has I have do ban starting instance. return; } GC.Collect(); } 

谢谢大家!

最后基于这篇文章,我找到了解决方案:

 public partial class App : Application { private Mutex _instanceMutex = null; protected override void OnStartup(StartupEventArgs e) { string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).Replace("\\", "."); // check that there is only one instance of the control panel running... bool createdNew; _instanceMutex = new Mutex(true, path, out createdNew); if (!createdNew) { _instanceMutex = null; MessageBox.Show("Instance already running"); Application.Current.Shutdown(); return; } base.OnStartup(e); } protected override void OnExit(ExitEventArgs e) { if (_instanceMutex != null) _instanceMutex.ReleaseMutex(); base.OnExit(e); } } 

您可以使用锁定文件来指示程序已经在该文件夹上运行。

当程序启动时,它检查目录中的文件。 如果找到了,它会关闭,如果没有,则创建一个并正常运行。 程序完成后,应该删除文件。

这当然不是很好的证明。 如果程序崩溃,文件将不会被删除,用户可以在程序运行时删除文件,绕过初始检查。