Как определить, запущен ли экземпляр приложения .NET из определенного места? - PullRequest
1 голос
/ 16 января 2012

Мне нужно заблокировать приложение, если оно запускается из той же папки, но разрешить его, если то же приложение запускается из других папок.

Проблема в том, что когда приложение закрывается, оно становится невидимым, но все еще находится в памятипотому что это прекращает какую-то внутреннюю работу.

Вполне возможно, что пользователь снова запустит это приложение из той же папки, когда старый экземпляр все еще останется в памяти.

Но, с другой стороны, это должно быть возможно, если это приложение запускаетсяиз других папок.

Любая подсказка, как это сделать в C #?


ОБНОВЛЕНИЯ:

1

На самом деле приложение записывает некоторые журналы влокальные файлы в подкаталоге, а также в файл локальной базы данных.Так что вполне возможно, что это может быть некоторый конфликт между 2 экземплярами.

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 ]

2 голосов
/ 16 января 2012

Спасибо вам всем!

Наконец, основываясь на этом сообщении Я нашел решение:

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

}
0 голосов
/ 16 января 2012

Вы можете использовать файл блокировки, чтобы указать, что программа уже запущена в папке.

Когда программа запускается, она проверяет наличие файла в каталоге. Если он находит его, он выключается, если нет, он создает его и работает как обычно. Когда программа завершена, она должна удалить файл.

Это, конечно, не дурак. Файл не будет удален в случае сбоя программы, и пользователь может удалить файл во время работы программы, минуя первоначальную проверку.

...