2009-07-14 7 views
5

Mamy aplikację WinForms w języku C# 3.5 (SP 1). Chcielibyśmy ograniczyć aplikację do jednego procesu w pamięci z wieloma instancjami okien. Nie szukamy podejścia MDI, ale mamy oddzielne główne formularze bez uruchamiania wielu procesów aplikacji.Ograniczanie aplikacji WinForm do jednego procesu z wieloma instancjami

Jesteśmy oceny trzy podejścia:

  1. Okienka Wiadomości
  2. COM
  3. WCF

Mamy przybliżone dane dla pierwszego 2 (PInvoke z Windows, Messages i nadrzędnym WinProc, Rejestru COM itp.) I korzystają ze starszych technologii.

Omówiliśmy pomysł użycia WCF z nazwanymi rurami zamiast tego i myślimy, że to może być najczystszy i najprostszy sposób na wykonanie tego zadania.

Jaki jest najczystszy, nowoczesny sposób ograniczenia aplikacji do jednego procesu z wieloma instancjami głównego formularza?

+0

Co zrobić Com, WCF i Windows Wiadomości mają z tym wspólnego? –

+0

Ktoś wyrzucił rejestrację pierwszej aplikacji z COM w rejestrze, a następnie zapytał, kiedy aplikacja ładuje się, aby zadzwonić do istniejącej aplikacji. Innym pomysłem było przeciążenie WinProc i PInvoke a WM_COMMAND w celu utworzenia instancji okna dialogowego. WCF utworzyłby dla nas nazwaną potokę. Przynajmniej to zostało wyrzucone. – blu

+0

Ok, wszystko, co chcesz wiedzieć, to jak powiedzieć już działającej instancji aplikacji, aby utworzyć nowe okno podczas próby uruchomienia drugiej instancji? Komunikat okna będzie działał dobrze, ale WCF będzie bardziej wszechstronny, jeśli chodzi o interfejs, parametry, konfigurację i myślę, że byłoby czystsze. – mlessard

Odpowiedz

3

Jedną z metod, które stosowałem w przeszłości, było wykorzystanie obiektu mutex systemu. Teoria, która się za tym kryje, polega na tym, że pierwsza instancja aplikacji wygeneruje obiekt mutex i kolejne instancje aplikacji, a następnie spróbuje otworzyć uchwyt do predefiniowanego muteksu i jeśli istnieje, to bamo! wyjdź z drugiej i trzeciej i czwartej .... instancji.

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

Pytanie nie jest zbyt jasne. Rozumiem, że wiesz już, jak ograniczyć aplikację do tylko jednej instancji, i że chcesz, aby kilka wystąpień głównej formy wykonywało się niezależnie, ale w tym samym procesie, prawda? A następnie szukasz najlepszego sposobu na komunikację?

W tym celu utworzę kilka Application Domains w twoim procesie. W ten sposób możesz wyizolować każdy formularz tak, jakby działał we własnym procesie. Będą używać oddzielnych przestrzeni adresowych, mogą być zatrzymywane niezależnie, a kod w jednej domenie nie może wpływać na kod w innych domenach (usterki itp.).

Do komunikacji pomiędzy różnymi formami/domen aplikacji użyłbym WCF, ponieważ jest to nowoczesny sposób to zrobić między procesami i międzyregionalnej aplikację lub komunikację między maszynowym w .NET Framework