C# (.NET 2.0) 中 Windows 的进程间通信

Posted

技术标签:

【中文标题】C# (.NET 2.0) 中 Windows 的进程间通信【英文标题】:Interprocess communication for Windows in C# (.NET 2.0) 【发布时间】:2008-09-08 17:00:00 【问题描述】:

我以前从未在 Windows 上进行过 IPC。我正在开发一对程序、一个标准的 GUI/CLI 应用程序和一个 Windows 服务。该应用程序必须告诉服务该做什么。那么,假设通信仅在本地进行,那么这两个进程的最佳通信方法是什么? 最好我的意思是更健壮和更不容易出错,不是最好的性能也不是最容易编码的。

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

【问题讨论】:

【参考方案1】:

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

WCF

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

代码示例

WCF 类 NetNamedPipeBinding 可用于同一台计算机上的进程间通信。此类的 MSDN 文档包括涵盖此场景 http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx 的代码示例

远程处理

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

代码示例

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

资源

GenuineChannels,销售包含共享内存通道的远程处理工具包。 http://www.genuinechannels.com/Index.aspx Ingo Rammer,编写了权威的 .Net 远程书籍,Advanced .NET Remoting, Second Edition

Win32 RPC 使用 csharptest-net RpcLibrary

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

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

MSDN 参考资料:

rpc 的工作原理:http://technet.microsoft.com/en-us/library/cc738291(v=ws.10).aspx RPC 函数:http://msdn.microsoft.com/en-us/library/aa378623(v=VS.85).aspx

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


WM_COPYDATA

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

资源

MSDN - WM_COPYDATA Code example PInvoke.net declaration

套接字

使用自定义协议(更难)

【讨论】:

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】:

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

【讨论】:

信号量是线程/进程共享内存时使用的一种技术。

以上是关于C# (.NET 2.0) 中 Windows 的进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 3.0 编译的 C# 2.0 代码使用程序集

C#:.NET 2.0 框架中的 Java 错误

使用 WIA 2.0 和 C# 扫描多页时跳过的页面

在 C# .NET 4.5 中使用 SAML 2.0

创建本地用户帐户 c# 和 .NET 2.0

如何创建 Web 服务 | ASP.NET 2.0 | C# |网页服务