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

时间:2012-01-16 18:23:12

标签: c# .net windows mutex

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

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

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

但另一方面,如果此应用程序从其他文件夹运行,则应该可以。

如何在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();              
            }

2 个答案:

答案 0 :(得分:2)

谢谢大家!

最后基于这个post我找到了解决方案:

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);
        }

}

答案 1 :(得分:0)

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

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

这当然不是万无一失的。如果程序崩溃,则不会删除该文件,并且用户可以在程序运行时删除该文件,从而绕过初始检查。