Контроль одного экземпляра приложения C# в Linux

2458
12 февраля 2020, 21:20

Пытаюсь адаптировать виндовое C# WinForm приложение для работы в Linux. В Linux установлено Mono, т.е. запускаю прогу с его помощью. Для контроля за одним экземпляром приложения использовал такой класс:

public class SingleInstance :
        WindowsFormsApplicationBase
    {
        public static SingleInstance app;
        private SingleInstance()
        {
            this.IsSingleInstance = true;
        }
        public static void Run(Form_Log f,
            StartupNextInstanceEventHandler startupHandler)
        {
            app = new SingleInstance();
            app.MainForm = f;
            app.MainForm.Deactivate += MainForm_Deactivate;
            app.StartupNextInstance += startupHandler;
            app.Run(Environment.GetCommandLineArgs());
        }  
    }

Но в Linux все равно запускается несколько копий приложения.

Как правильно организовать работу приложения в единственном экземпляре?

UPD

Тут возник еще вопрос. Возможно, мой код работает корректно, но я как-то неверно запускаю свое приложение. Сейчас запуск примерно такой: mono MyApp.exe (в терминале). Может есть какой другой более правильный способ запуска?

Answer 1

Пример простой блокировки на файлах:

using System;
using System.IO;
namespace EmptyConsole
{
    class MainClass
    {
        private static FileStream _lockFile;
        public static void Main(string[] args)
        {
            if (!TryOpenLockFile(out _lockFile)) {
                Console.WriteLine("Приложение уже запущено");
                Console.ReadKey();
                return;
            }
            using (_lockFile) {
                Console.WriteLine("Hello World!");
                Console.ReadKey();
            }
        }
        static bool TryOpenLockFile(out FileStream fileStream)
        {
            var fileName = Path.GetTempPath() + "MySuperApplication.lock";
            try {
                fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
                fileStream.Lock(0, 0);
            }
            catch (IOException) {
                fileStream = null;
                return false;
            }
            return true;
        }
    }
}
READ ALSO
Обратиться к открытому процессу (process)

Обратиться к открытому процессу (process)

Как обратиться к уже запущенному на компьютере процессу, прочитать линию или подать новую командуДопустим на компьютере запущен Process

2445
Проблема с созданием Excel файла в C#

Проблема с созданием Excel файла в C#

Проблема заключается в следующем: Есть код (ниже показан), который выгружает данные из DataGridView2 в Excel, но в момент создания Excel файла (xlexcel = new MicrosoftOffice

46
Triangle.NET не триангулирет область с отверстием

Triangle.NET не триангулирет область с отверстием

При триангуляции поверхности с данными координатами дырки TriangleNet некоректно триангулирует область

36
Неправильно работают рикошеты

Неправильно работают рикошеты

Rigidbody2D стоит и у Bullet, и у StoneКоллайдеры тоже

61