Ограничение приложения WinForm к одному процессу с несколькими экземплярами

То, когда Вы сказали, "наша кодовая база не предоставляет себя легкому тестированию", является первым знаком запаха кода. Запись Модульных тестов означает типичную запись кода по-другому для создания кода более тестируемым. Это - хорошая вещь, по-моему, как, что я видел за эти годы в записи кода, на который я имел к тестам записи, это вынудило меня выдвинуть лучший дизайн.

5
задан blu 14 July 2009 в 16:13
поделиться

2 ответа

Один из методов, которые я использовал в прошлом, заключался в использовании объекта системного мьютекса. Теория, лежащая в основе этого, заключается в том, что первый экземпляр приложения сгенерирует объект мьютекса, а последующие экземпляры приложения затем попытаются открыть дескриптор предопределенного мьютекса, и если он существует, тогда бамо! выйти из второго, третьего и четвертого .... экземпляров.

public static void CheckSingleInstance()
{
    bool created = false;
    _singleInstance = new Mutex(true, "PredefinedMutexName##1", out created);

    if (!created)
    {
        MessageBox.Show("Another instance of this application is already running. Click OK to switch to that instance.", "Application running", MessageBoxButtons.OK, MessageBoxIcon.Information);

        Process proc = Process.GetCurrentProcess();
        Process[] procs = Process.GetProcessesByName(proc.ProcessName);
        bool exit = false;
        Process process = null;
        foreach (Process p in procs)
        {
            if (p.Id != proc.Id && p.MainModule.FileName == proc.MainModule.FileName)
            {
                // ShowWindow(p.MainWindowHandle, 1/*SW_SHOWNORMAL*/);
                process = p;
                exit = true;
            }
        }
        if (exit)
        {
            Application.Exit();

            if (process != null)
                NativeMethods.SetForegroundWindow(process.MainWindowHandle);

            return;
        }
    }
}
3
ответ дан 15 December 2019 в 01:08
поделиться

Вопрос не очень ясный. Я понимаю, что вы уже знаете, как ограничить свое приложение только одним экземпляром, и что вы хотите, чтобы несколько экземпляров вашей основной формы выполнялись независимо, но внутри одного процесса, верно? И затем вы ищете лучший способ заставить их общаться?

Для этого я бы создал несколько доменов приложений в вашем процессе. Таким образом вы можете изолировать каждую форму, как если бы она выполнялась в отдельном процессе. Они будут использовать отдельные адресные пространства, их можно останавливать независимо, и код в одном домене не может влиять на код в других доменах (сбои и т. Д.).

Для связи между различными формами / доменами приложений я бы использовал WCF, поскольку это современный способ взаимодействия между процессами, приложениями или между компьютерами в .NET Framework

1
ответ дан 15 December 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: