【问题标题】:Interprocess communication for Windows in C# (.NET 2.0)C# (.NET 2.0) 中 Windows 的进程间通信
【发布时间】:2010-09-08 04:29:48
【问题描述】:

我以前从未在 Windows 上进行过 IPC。目前我正在开发一对程序,一个标准的 GUI/CLI 应用程序和一个 Windows 服务。该应用程序必须告诉服务该做什么。那么,假设通信仅在本地进行,那么这两个进程的最佳通信方法是什么?

最佳被定义为更健壮且不易出错,不是最高性能也不是最容易编码。

非常欢迎代码示例,但不是必需的:-)

注意我问的是使用什么,标准 TCP 套接字、命名管道或其他一些通信方式。

谢谢!

【问题讨论】:

    标签: c# .net ipc


    【解决方案1】:

    .Net 中的 IPC 可以通过以下方式实现:

    WCF

    使用命名管道需要 .Net 3.0 及更高版本。

    代码示例


    远程处理

    .Net 1.0 发布的原始 IPC 框架。我相信远程处理不再被积极开发,我们鼓励您改用 WCF

    代码示例

    Inter-process communication via Remoting - 使用 tcp 通道

    资源


    Win32 RPC 使用 csharptest-net RpcLibrary

    我最近遇到一个项目,它封装了 Win32 RPC 库并创建了一个可用于本地和远程 RPC 的 .net 类库

    项目主页http://csharptest.net/projects/rpclibrary/

    MSDN 参考资料:

    还有一个运行在库之上的 google protocol buffers rpc 客户端:https://code.google.com/p/protobuf-csharp-rpc/


    WM_COPYDATA

    为了完整起见,也可以使用带有WM_COPYDATA 消息的WIN32 方法。我之前在 .Net 1.1 中使用过这种方法来创建一个从 Windows 资源管理器打开多个文件的单实例应用程序。

    资源

    套接字

    使用自定义协议(更难)

    【讨论】:

    • WCF:就像我被鼓励使用 .NET 3.5 一样 :) 遗憾的是,远程处理似乎不是一个选项。
    【解决方案2】:

    仅限本地,我们已经成功使用命名管道。避免了 TCP 的开销,并且几乎(至少对于 .NET)尽可能高效,同时还有一个不错的 API 可供使用。

    【讨论】:

    • System.IO.Pipes 在 .Net 2.0 中不可用
    【解决方案3】:

    由于您仅限于 .Net 2.0,WCF 可能不是一个选项。您可以使用带有共享内存的 .Net 远程处理作为同一台机器上应用程序域之间的底层通信机制。使用这种方法,您可以轻松地将进程放在不同的机器上,并用网络协议替换共享内存协议。

    【讨论】:

      【解决方案4】:

      与 Windows 服务通信的标准方法是使用服务控制代码。 Windows 服务可以接收从 0 到 255 的代码。0-127 是为系统保留的。 128 到 255 可用于自定义命令。

      如果您需要将复杂对象发送到服务使用数据库、xml、文件、tcp、http 等。除了发送控制命令,如重新加载配置、进程项等,应该使用此控制代码。

      还有其他可用功能,例如查询服务。请参阅 Windows 服务文档和 api。

      http://arcanecode.com/2007/05/30/windows-services-in-c-sending-commands-to-your-windows-service-part-7/

      【讨论】:

        【解决方案5】:

        最好的办法是使用 WCF。您将能够在 Windows 服务中创建服务主机,并公开 GUI 应用程序可以使用的定义良好的接口。如果您愿意,WCF 将允许您通过命名管道进行通信,或者您可以选择任何其他通信协议,如 TCP、HTTP 等。使用 WCF,您可以获得强大的工具支持和大量可用信息。

        【讨论】:

          【解决方案6】:

          我想加入这个讨论。如果这是出路,请责备我 - 但是信号量(或多个信号量)不能用于基本通信吗?

          【讨论】:

          • 信号量是线程/进程共享内存时使用的一种技术。
          猜你喜欢
          • 2010-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多