2009-07-14 9 views
5

Abbiamo un'applicazione WinForms in C# 3.5 (SP 1). Vorremmo limitare l'applicazione a un processo in memoria con istanze di finestre multiple. Non stiamo cercando un approccio MDI, ma di avere istanze di moduli principali separate senza avviare più processi di applicazione.Restrizione dell'applicazione WinForm a un processo con più istanze

stiamo valutando tre approcci:

  1. di Windows Messaggi
  2. COM
  3. WCF

Abbiamo i dettagli di massima per le prime 2 (PInvoke con messaggi di Windows e WinProc prioritario, Registro COM, ecc.) E utilizzano tecnologie meno recenti.

Abbiamo discusso l'idea di utilizzare WCF con pipe denominate e ritengo che questo potrebbe essere il modo più semplice e pulito per eseguire l'operazione in questione.

Qual è il modo più pulito e moderno per limitare l'applicazione a un processo con più istanze di moduli principali?

+0

Cosa fare COM, WCF e i messaggi di Windows hanno a che fare con questo? –

+0

Qualcuno si è buttato fuori registrando la prima applicazione con COM nel registro e quindi interrogando che quando l'applicazione carica per chiamare l'app esistente. L'altra idea era di sovraccaricare WinProc e PInvoke un WM_COMMAND per creare l'istanza della finestra di dialogo. WCF creerebbe una pipe denominata per noi. Almeno questo è stato buttato là fuori. – blu

+0

Ok, tutto quello che vuoi sapere è come dire all'istanza già in esecuzione dell'applicazione di creare una nuova finestra quando provi ad eseguire una seconda istanza? Un messaggio Window funzionerà bene, ma WCF sarebbe più versatile, per l'interfaccia, i parametri, la configurazione e penso che sarebbe più pulito. – mlessard

risposta

3

Uno dei metodi che ho impiegato in passato era quello di utilizzare un oggetto mutex di sistema. La teoria dietro è che la prima istanza dell'applicazione genererà l'oggetto mutex e le successive istanze dell'applicazione tenteranno quindi di aprire un handle per il mutex predefinito e se esiste, allora bamo! esci dalla seconda, terza e quarta .... istanza.

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

La domanda non è molto chiara. Capisco che tu sappia già come limitare la tua applicazione a una sola istanza e che desideri che diverse istanze del tuo modulo principale vengano eseguite indipendentemente ma all'interno dello stesso processo, giusto? E poi stai cercando il modo migliore per farli comunicare?

Per fare questo creerei diversi Application Domains nel vostro processo. In questo modo puoi isolare ogni modulo come se fosse in esecuzione nel suo stesso processo. Utilizzeranno spazi di indirizzi separati, possono essere fermati indipendentemente e il codice in un dominio non può influenzare il codice in altri domini (errori, ecc.).

Per la comunicazione tra i moduli differenti domini applicativi/Vorrei usare WCF in quanto è il modo moderno di fare inter-processo o inter-applicazione o la comunicazione inter-macchina in .NET Framework

Problemi correlati