Ограничение приложения WinForm одним процессом с несколькими экземплярами - PullRequest
5 голосов
/ 14 июля 2009

У нас есть приложение WinForms в C # 3.5 (SP 1). Мы хотели бы ограничить приложение одним процессом в памяти с несколькими экземплярами окна. Мы не ищем MDI-подход, а должны иметь отдельные основные экземпляры форм без запуска нескольких процессов приложения.

Мы оцениваем три подхода:

  1. Сообщения Windows
  2. COM
  3. WCF

У нас есть грубые детали для первых 2 (PInvoke с сообщениями Windows и переопределением WinProc, COM Registry и т. Д.), И они используют более старые технологии.

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

Какой самый чистый, современный способ ограничить приложение одним процессом с несколькими основными экземплярами форм?

Ответы [ 2 ]

3 голосов
/ 14 июля 2009

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

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;
        }
    }
}
1 голос
/ 14 июля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...