同一个盒子上的进程间通信 - 两个应用程序或进程之间的通信

时间:2014-01-13 21:00:06

标签: c# .net ipc

在同一个盒子上的应用程序之间实现进程间通信的最佳方法是什么 - 都是用c#编写的?

管理器应用程序将发送命令,例如:停止,启动到其他应用程序。它还将监视应用程序并可能要求数据。

所有应用程序都将在Windows 7操作系统上运行的同一台计算机上运行。

IPC频道是一个不错的选择吗?被命名为Pipes更好的选择?或者套接字是更好的选择吗?

正在管理的应用程序都具有相同的名称。当它们启动时,它们会加载一个dll来确定运行哪些算法。

由于

2 个答案:

答案 0 :(得分:7)

将其缩小,将WCF与命名管道一起使用。

这是一个关于这个问题的链接:What is the best choice for .NET inter-process communication?

答案 1 :(得分:0)

一种执行此操作的方法,特别是如果您想在从同一应用程序剥离的不同进程之间进行通信时,请使用MemoryMappedFile。这是最简单的示例-将其放入控制台应用程序。启动它的2个实例,然后快速依次在其中一个中键入w+enter,在另一个中键入r+enter。看。注意–我取消了读写时序的同步,因此您可以看到有时数据有时会发生变化,而其他时间却发生了变化-

class Program
{
    private static MemoryMappedFile _file = MemoryMappedFile.CreateOrOpen("XXX_YYY", 1, MemoryMappedFileAccess.ReadWrite);
    private static MemoryMappedViewAccessor _view = _file.CreateViewAccessor();

    static void Main(string[] args)
    {
        askforinput:
        Console.WriteLine("R for read, W for write");
        string input = Console.ReadLine();

        if (string.Equals(input, "r", StringComparison.InvariantCultureIgnoreCase))
            StartReading();
        else if (string.Equals(input, "w", StringComparison.InvariantCultureIgnoreCase))
            StartWriting();
        else
            goto askforinput;


        _view.Dispose();
        _file.Dispose();   

    }

    private static void StartReading()
    {

        bool currVal = false;

        for (int i = 0; i < 100; i++)
        {
            currVal = currVal != true;
            Console.WriteLine(_view.ReadBoolean(0));
            Thread.Sleep(221);
        }
    }

    private static void StartWriting()
    {

        bool currVal = false;

        for (int i = 0; i < 100; i++)
        {
            currVal = currVal != true;
            _view.Write(0, currVal);
            Console.WriteLine("Writen: " + currVal.ToString());
            Thread.Sleep(500);
        }
    }
}

同样,您可以使用“内存映射文件”构建非常复杂且强大的通信层。这只是简单的例子。