2009-07-14 1 views
5

Wir haben eine WinForms-Anwendung in C# 3.5 (SP 1). Wir möchten die Anwendung auf einen Prozess im Speicher mit mehreren Fensterinstanzen beschränken. Wir suchen nicht nach einem MDI-Ansatz, sondern nach separaten Hauptformularinstanzen, ohne mehrere Anwendungsprozesse starten zu müssen.Einschränken der WinForm-Anwendung auf einen Prozess mit mehreren Instanzen

Wir evaluieren drei Ansätze:

  1. Windows-Nachrichten
  2. COM
  3. WCF

Wir haben die groben zu den ersten 2 (PInvoke mit Windows-Nachrichten und überwiegendes WinProc, COM Registry usw.) und sie verwenden ältere Technologien.

Wir haben die Idee diskutiert, WCF stattdessen mit Named Pipes zu verwenden und denken, dass dies der sauberste und einfachste Weg ist, die anstehende Aufgabe zu erfüllen.

Was ist die sauberste, moderne Methode, um die Anwendung auf einen Prozess mit mehreren Hauptformularinstanzen zu beschränken?

+0

zu tun Was COM tun, WCF und Windows Messages haben damit zu tun? –

+0

Jemand hat die erste Anwendung mit COM in der Registrierung registriert und dann abgefragt, wenn die Anwendung zum Aufruf der bestehenden App geladen wird. Die andere Idee war, WinProc zu überlasten und PInvoke ein WM_COMMAND, um die Instanz des Dialogfelds zu erstellen. WCF würde eine benannte Pipe für uns erstellen. Zumindest wurde das dort rausgeworfen. – blu

+0

Ok, alles, was Sie wissen möchten, ist, wie Sie der bereits laufenden Instanz der Anwendung mitteilen, ein neues Fenster zu erstellen, wenn Sie versuchen, eine zweite Instanz auszuführen? Eine Window Message funktioniert gut, aber WCF wäre vielseitiger, für die Schnittstelle, Parameter, Konfiguration und ich denke, es wäre sauberer. – mlessard

Antwort

3

Eine der Methoden, die ich in der Vergangenheit angewendet habe, war die Verwendung eines System-Mutex-Objekts. Die Theorie dahinter ist, dass die erste Instanz der Anwendung das Mutex-Objekt generieren wird und nachfolgende Instanzen der Anwendung versuchen, ein Handle für den vordefinierten Mutex zu öffnen, und falls es existiert, dann wird bamo! Verlasse die zweite und dritte und vierte .... Instanz.

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

Die Frage ist nicht sehr klar. Ich verstehe, dass Sie bereits wissen, wie Sie Ihre Anwendung auf nur eine Instanz beschränken können und dass mehrere Instanzen Ihres Hauptformulars unabhängig voneinander ausgeführt werden sollen, aber innerhalb desselben Prozesses, oder? Und dann suchen Sie nach dem besten Weg, um sie kommunizieren zu lassen?

Um dies zu tun, würde ich mehrere Application Domains in Ihrem Prozess erstellen. Auf diese Weise können Sie jedes Formular so isolieren, wie es in seinem eigenen Prozess ausgeführt wurde. Sie verwenden separate Adressräume, können unabhängig voneinander angehalten werden und Code in einer Domäne kann den Code in anderen Domänen nicht beeinflussen (Fehler usw.).

Für die Kommunikation zwischen den verschiedenen Formen/Anwendungsdomänen ich WCF verwenden würde, wie es die moderne Art und Weise ist Inter-Prozess oder zwischen Anwendungen oder Inter-Maschine-Kommunikation in .NET Framework