2 C#进程之间最简单的进程间通信方法是什么?

时间:2009-02-09 15:37:11

标签: c# ipc

我希望在父进程和子进程之间进行通信,这些进程都是用C#编写的。它应该是异步的,事件驱动的。我不想在处理非常罕见的通信的每个进程中运行一个线程。

最佳解决方案是什么?

9 个答案:

答案 0 :(得分:34)

Anonymous pipes

对BeginRead / BeginWrite和AsyncCallback使用异步操作。

答案 1 :(得分:15)

如果您的流程位于同一台计算机上,则只需使用 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();
}

检测Main

上的args
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);
        }
    }
    //...
}

答案 2 :(得分:8)

我建议使用Windows Communication Foundation:

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

您可以来回传递对象,使用各种不同的协议。我建议使用二进制tcp协议。

答案 3 :(得分:5)

答案 4 :(得分:1)

还有COM

有技术性,但我说优点是您可以调用您可以定义的方法。

MSDN提供C#COM互操作教程。请搜索,因为这些链接确实发生了变化。

立即开始使用here ...

答案 5 :(得分:1)

还有MSMQ(Microsoft消息队列),它可以跨网络以及在本地计算机上运行。尽管有更好的交流方式,但值得研究:https://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx

答案 6 :(得分:1)

答案 7 :(得分:0)

C#中用于进程间通信的最简单解决方案是安全性,并且考虑到您的约束(同一台计算机上的两个C#进程)是Remoting API。现在,Remoting是一项遗留技术(与已弃用的技术不同),不鼓励在新项目中使用,但它确实运行良好,并且不需要很多浮躁和环境来工作。

Remoting框架中有一个excellent article on MSDN for using the class IpcChannel(贷记为Greg Beech for the find here),用于设置简单的远程服务器和客户端。

我建议先尝试这种方法,然后再尝试将代码移植到WCF(Windows Communication Framework)。具有多个优点(更好的安全性,跨平台),但必定更复杂。幸运的是,MSDN有一个very good article for porting code from Remoting to WCF

如果您想立即和WCF there is a great tutorial here一起潜水。

答案 8 :(得分:-1)

精通

如果可能的话,更容易制作共享文件!

//out
File.AppendAllText("sharedFile.txt", "payload text here");
// in
File.ReadAllText("sharedFile.txt");