Информация об изменениях

Сообщение Re: [FW 4.5] Открытие файла в уже имеющемся процессе от 21.06.2021 1:47

Изменено 21.06.2021 2:28 Разраб

Re: [FW 4.5] Открытие файла в уже имеющемся процессе
Здравствуйте, karbofos42, Вы писали:

K>Имеется программа на .NET FW 4.5, которая умеет открывать файлики. Программа эта должна работать в единственном экземпляре.

K>При открытии файла, Windows соответственно запускает новый процесс и аргументом передаёт путь к файлу. Если программа уже запущена, то файл не получится открыть двойным кликом, что печально и глупо заставлять закрывать программу, чтобы следом её опять открыть.
K>Только ручками прикручивать какой-нибудь IPC, пересылать из нового экземпляра аргументы командной строки и убиваться?
K>Или есть какое-нибудь решение попроще?

Если ПО выполняется в консоли:
using System;
using System.Diagnostics;
namespace Proba3
{
    class Program
    {
        static void Main(string[] args)
        {
            var current = Process.GetCurrentProcess();
            var proccesses = Process.GetProcesses();
            foreach(var proccess in proccesses)
            {
                if(proccess.Id == current.Id)
                    continue;
                    if(proccess.MainModule.FileName == current.MainModule.FileName)
                    {
                        proccess.Kill(true);
                        break;
                    }
            }

            Console.WriteLine($"Do something with file {args[0]}");
        }
    }
}


Если в терминальной сессии то через Mutex (hint keywords: префикс global)
Re: [FW 4.5] Открытие файла в уже имеющемся процессе
Здравствуйте, karbofos42, Вы писали:

K>Имеется программа на .NET FW 4.5, которая умеет открывать файлики. Программа эта должна работать в единственном экземпляре.

K>При открытии файла, Windows соответственно запускает новый процесс и аргументом передаёт путь к файлу. Если программа уже запущена, то файл не получится открыть двойным кликом, что печально и глупо заставлять закрывать программу, чтобы следом её опять открыть.
K>Только ручками прикручивать какой-нибудь IPC, пересылать из нового экземпляра аргументы командной строки и убиваться?
K>Или есть какое-нибудь решение попроще?

Если ПО выполняется в консоли(один пользователь):
using System;
using System.Diagnostics;
namespace Proba3
{
    class Program
    {
        static void Main(string[] args)
        {
            var current = Process.GetCurrentProcess();
            var proccesses = Process.GetProcesses();
            foreach(var proccess in proccesses)
            {
                if(proccess.Id == current.Id)
                    continue;
                    if(proccess.MainModule.FileName == current.MainModule.FileName)
                    {
                        proccess.Kill(true);
                        break;
                    }
            }

            Console.WriteLine($"Do something with file {args[0]}");
        }
    }
}


Если в терминальной сессии то через Mutex (hint keywords: префикс global)

UPD: как правильно заметили все равно убиваться. так проще убиться в самом начале и не городить многопоточку из-за такого пустяка.