将WinForm应用程序限制为具有多个实例的一个进程

时间:2009-07-14 16:13:58

标签: c# winforms wcf winapi com

我们在C#3.5(SP 1)中有一个WinForms应用程序。我们希望将应用程序限制在具有多个窗口实例的内存中的一个进程。我们不是在寻找MDI方法,而是在不启动多个应用程序进程的情况下拥有单独的主表单实例。

我们正在评估三种方法:

  1. Windows消息
  2. COM
  3. WCF
  4. 我们有前2个(PInvoke with Windows Messages and overrr WinProc,COM Registry等)的粗略细节,他们使用旧技术。

    我们讨论了将WCF与命名管道一起使用的想法,并认为这可能是完成手头任务的最简洁和最简单的方法。

    将应用程序限制为具有多个主要表单实例的一个进程的最简洁,最现代的方法是什么?

2 个答案:

答案 0 :(得分:3)

我过去采用的一种方法是使用系统互斥对象。它背后的理论是,应用程序的第一个实例将生成互斥对象,然后应用程序的后续实例尝试打开预定义互斥锁的句柄,如果存在,则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 :(得分:1)

问题不是很清楚。我知道你已经知道如何将应用程序限制为只有一个实例,并且你希望主表单的几个实例独立执行但在同一个进程中,对吧?然后你正在寻找让他们沟通的最佳方式吗?

为此,我会在您的流程中创建多个Application Domains。这样,您可以隔离每个表单,就像它在自己的进程中运行一样。它们将使用单独的地址空间,可以独立停止,一个域中的代码不会影响其他域中的代码(故障等)。

对于不同表单/应用程序域之间的通信,我将使用WCF,因为它是在.NET Framework中进行进程间或应用程序间或机器间通信的现代方法