2009-02-09 5 views
45

Ich möchte kommunizieren zwischen einem Eltern-Kind-Prozess beide in C# geschrieben. Es sollte asynchron, ereignisgesteuert sein. Ich möchte keinen Thread in jedem Prozess ausführen, der die sehr seltene Kommunikation behandelt.Was ist die einfachste Methode der prozessübergreifenden Kommunikation zwischen 2 C# -Prozessen?

Was ist die beste Lösung dafür?

+1

ich getan habe einen Artikel auf meinem Blog eines wirklich einfaches Beispiel für Interprozesskommunikation mit Named Pipes in WCF loszulegen. [https://dopeydev.com/wcf-interprocess-communication/](https://dopeydev.com/wcf-interprocess-communication/) –

Antwort

9

Ich würde vorschlagen, die Windows Communication Foundation mit:

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

Sie Objekte hin und her passieren können, um eine Vielzahl verschiedenen Protokolle verwenden. Ich würde vorschlagen, das binäre tcp-Protokoll zu verwenden.

+57

... was ist dann der komplizierte Weg? – dfasdljkhfaskldjhfasklhf

+4

@BPAndrew: Überschreiben Sie Ihre eigene Version von WCF? ;) – technophile

+50

Wenn WCF die "einfachste Methode" ist, möchte ich wirklich weinen: P – kizzx2

13

Wenn Ihre Prozesse in demselben Computer Sie einfach stdio verwenden können.

Dies ist meine Nutzung, eine Web-Seite screen:

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

Detect args auf Haupt

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

Funktioniert jedoch nicht, wenn der Zielprozess eine GUI haben muss, d. H. Wenn 'ProcessStartInfo.UseShellExecute' 'wahr' ist. In diesem Fall können Sie die Standardausgabe und den Fehler nicht umleiten. –

+0

@GuidoDomenici Sie können es tatsächlich verwenden, wenn es eine GUI hat .... –

+0

@JayCroghan ich glaube nicht, dass Sie es verwenden können, wenn es eine GUI hat. Zumindest wenn der Client-Prozess über eine Web-Anwendung gestartet wird. – Balanikas

0

Es gibt auch COM.

Es gibt technische Details, aber ich würde sagen, der Vorteil ist, dass Sie Methoden aufrufen können, die Sie definieren können.

MSDN bietet C# COM Interop-Lernprogramme. Bitte suchen Sie, da sich diese Links ändern.

Um rightaway gehen here ...

Verwandte Themen