2009-02-09 11 views
45

मैं सी # में लिखे गए माता-पिता और बाल प्रक्रिया के बीच संवाद करना चाहता हूं। यह असीमित, घटना संचालित होना चाहिए। मैं बहुत ही दुर्लभ संचार को संभालने वाली हर प्रक्रिया में एक धागा नहीं चलाना चाहता हूं।2 सी # प्रक्रियाओं के बीच अंतर-प्रक्रिया संचार की सबसे सरल विधि क्या है?

इसके लिए सबसे अच्छा समाधान क्या है?

+1

मैं अंतर संचार प्रक्रिया WCF में नामांकित पाइप्स का उपयोग करने का एक बहुत ही सरल उदाहरण के अपने ब्लॉग पर एक लेख किया है। [https://dopeydev.com/wcf-interprocess-communication/](https://dopeydev.com/wcf-interprocess-communication/) –

उत्तर

9

मैं Windows संचार फाउंडेशन का उपयोग कर सुझाव है:

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

आप आगे और पीछे वस्तुओं पारित कर सकते हैं अलग प्रोटोकॉल की एक किस्म का उपयोग करें। मैं बाइनरी टीसीपी प्रोटोकॉल का उपयोग करने का सुझाव दूंगा।

+57

... तो जटिल तरीका क्या है? – dfasdljkhfaskldjhfasklhf

+4

@BPAndrew: डब्ल्यूसीएफ के अपने संस्करण को पुनर्लेखन? ;) – technophile

+50

यदि डब्ल्यूसीएफ "सरल विधि" है, तो मैं वास्तव में रोना चाहता हूं: पी – kizzx2

13

एक ही कंप्यूटर में अपनी प्रक्रियाओं, तो आप बस stdio उपयोग कर सकते हैं।

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

मुख्य

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

काम नहीं करेगा हालांकि लक्ष्य प्रक्रिया को जीयूआई होना चाहिए, यानी यदि 'ProcessStartInfo.UseShellExecute'' सत्य' है। उस स्थिति में आप मानक आउटपुट और त्रुटि को पुनर्निर्देशित नहीं कर सकते हैं। –

+0

@ गुइडोडोमेनिसि आप वास्तव में इसका उपयोग कर सकते हैं जब उसके पास GUI है .... –

+0

@JayCroghan मुझे नहीं लगता कि आप इसका उपयोग कर सकते हैं जब यह एक जीयूआई है। कम से कम जब ग्राहक प्रक्रिया वेब अनुप्रयोग से लॉन्च की जाती है। – Balanikas

0

वहाँ भी है COM पर आर्ग का पता लगाने:

यह मेरा उपयोग, एक वेब पेज screenshooter है।

तकनीकी हैं, लेकिन मैं कहूंगा कि लाभ यह है कि आप उन विधियों को कॉल करने में सक्षम होंगे जिन्हें आप परिभाषित कर सकते हैं।

एमएसडीएन सी # कॉम इंटरऑप ट्यूटोरियल प्रदान करता है। कृपया खोज करें क्योंकि ये लिंक बदलते हैं।

rightaway आरंभ करने के लिए here जाना ...

संबंधित मुद्दे