2009-02-09 25 views
45

Quiero comunicarme entre un proceso primario y secundario ambos escritos en C#. Debe ser asincrónico, impulsado por eventos. No quiero ejecutar un hilo en cada proceso que maneje la muy rara comunicación.¿Cuál es el método más simple de comunicación entre procesos entre 2 procesos C#?

¿Cuál es la mejor solución para ello?

+1

que he hecho un artículo en mi blog de un ejemplo muy simple de comunicación entre procesos utilizando canalizaciones con nombre en WCF. [https://dopeydev.com/wcf-interprocess-communication/](https://dopeydev.com/wcf-interprocess-communication/) –

Respuesta

9

se recomienda usar el Windows Communication Foundation:

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

Puede pasar objetos de ida y vuelta, utilizar una variedad de diferentes protocolos. Sugeriría usar el protocolo tcp binario.

+57

... entonces, ¿cuál es el camino complicado entonces? – dfasdljkhfaskldjhfasklhf

+4

@BPAndrew: ¿Reescribiendo su propia versión de WCF? ;) – technophile

+50

Si WCF es el "método más simple", realmente quiero llorar: P – kizzx2

13

Si sus procesos en mismo equipo, simplemente se pueden utilizar stdio.

Ésta es mi uso, un screenshooter página Web:

 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(); 
     } 

Detectar args en 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

Sin embargo, no funcionará si el proceso de destino necesita una GUI, es decir, si 'ProcessStartInfo.UseShellExecute' es' true'. En ese caso, no puede redirigir la salida y el error estándar. –

+0

@GuidoDomenici Realmente puede usarlo cuando tiene una GUI .... –

+0

@JayCroghan No creo que pueda usarlo cuando tiene una GUI. Al menos cuando el proceso del cliente se inicia desde una aplicación web. – Balanikas

0

También hay COM.

Existen tecnicismos, pero yo diría que la ventaja es que podrá llamar a métodos que puede definir.

MSDN ofrece tutoriales de interoperabilidad C# COM. Por favor busca porque estos enlaces cambian.

Para empezar rightaway ir here ...

Cuestiones relacionadas