我们在C#3.5(SP 1)中有一个WinForms应用程序。我们希望将应用程序限制在具有多个窗口实例的内存中的一个进程。我们不是在寻找MDI方法,而是在不启动多个应用程序进程的情况下拥有单独的主表单实例。
我们正在评估三种方法:
我们有前2个(PInvoke with Windows Messages and overrr WinProc,COM Registry等)的粗略细节,他们使用旧技术。
我们讨论了将WCF与命名管道一起使用的想法,并认为这可能是完成手头任务的最简洁和最简单的方法。
将应用程序限制为具有多个主要表单实例的一个进程的最简洁,最现代的方法是什么?
答案 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中进行进程间或应用程序间或机器间通信的现代方法