2009-02-09 16 views
45

Desidero comunicare tra un processo padre e figlio sia scritto in C#. Dovrebbe essere asincrono, basato su eventi. Non voglio eseguire una discussione in ogni processo che gestisce la comunicazione molto rara.Qual è il metodo più semplice di comunicazione tra processi tra 2 processi C#?

Qual è la soluzione migliore?

+1

ho fatto un articolo sul mio blog di un esempio molto semplice di comunicazione tra processi utilizzando Named Pipe in WCF. [https://dopeydev.com/wcf-interprocess-communication/](https://dopeydev.com/wcf-interprocess-communication/) –

risposta

9

Io suggerirei di usare Windows Communication Foundation:

http://en.wikipedia.org/wiki/Windows_Communication_Foundation

È possibile passare oggetti avanti e indietro, utilizzare una varietà di diversi protocolli. Suggerirei di utilizzare il protocollo tcp binario.

+57

... quindi qual è il modo complicato allora? – dfasdljkhfaskldjhfasklhf

+4

@BPAndrew: riscrivere la propria versione di WCF? ;) – technophile

+50

Se WCF è il "metodo più semplice", voglio davvero piangere: P – kizzx2

13

Se i processi nello stesso computer, è possibile utilizzare semplicemente stdio.

Questo è il mio utilizzo, una pagina web screenshooter:

 var jobProcess = new Process(); 

     jobProcess.StartInfo.FileName = Assembly.GetExecutingAssembly().Location; 
     jobProcess.StartInfo.Arguments = "job"; 

     jobProcess.StartInfo.CreateNoWindow = false; 
     jobProcess.StartInfo.UseShellExecute = false; 

     jobProcess.StartInfo.RedirectStandardInput = true; 
     jobProcess.StartInfo.RedirectStandardOutput = true; 
     jobProcess.StartInfo.RedirectStandardError = true; 

     // Just Console.WriteLine it. 
     jobProcess.ErrorDataReceived += jp_ErrorDataReceived; 

     jobProcess.Start(); 

     jobProcess.BeginErrorReadLine(); 

     try 
     { 
      jobProcess.StandardInput.WriteLine(url); 
      var buf = new byte[int.Parse(jobProcess.StandardOutput.ReadLine())]; 
      jobProcess.StandardOutput.BaseStream.Read(buf, 0, buf.Length); 
      return Deserz<Bitmap>(buf); 
     } 
     finally 
     { 
      if (jobProcess.HasExited == false) 
       jobProcess.Kill(); 
     } 

Rileva args su Main

static void Main(string[] args) 
{ 
    if (args.Length == 1 && args[0]=="job") 
    { 
     //because stdout has been used by send back, our logs should put to stderr 
     Log.SetLogOutput(Console.Error); 

     try 
     { 
      var url = Console.ReadLine(); 
      var bmp = new WebPageShooterCr().Shoot(url); 
      var buf = Serz(bmp); 
      Console.WriteLine(buf.Length); 
      System.Threading.Thread.Sleep(100); 
      using (var o = Console.OpenStandardOutput()) 
       o.Write(buf, 0, buf.Length); 
     } 
     catch (Exception ex) 
     { 
      Log.E("Err:" + ex.Message); 
     } 
    } 
    //... 
} 
+3

Tuttavia, non funziona se il processo di destinazione necessita di una GUI, ad esempio se "ProcessStartInfo.UseShellExecute' è' true'. In tal caso non è possibile reindirizzare l'output standard e l'errore. –

+0

@GuidoDomenici Si può effettivamente usarlo quando ha una GUI .... –

+0

@JayCroghan non penso che tu possa usarlo quando ha una GUI. Almeno quando il processo client viene avviato da un'applicazione Web. – Balanikas

0

C'è anche COM.

Ci sono degli aspetti tecnici, ma direi che il vantaggio è che sarete in grado di chiamare metodi che è possibile definire.

MSDN offre tutorial di interoperabilità COM C#. Per favore cerca perché questi link cambiano.

Per iniziare rightaway andare here ...

Problemi correlati