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

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

最好的地方定义为更健壮,更不易出错,而不是性能最高或最容易编写的地方。

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

请注意,我在询问要使用什么,标准TCP套接字,命名管道或仅其他一些通信方式。

谢谢!

Vinko Vrsalovic asked 2020-01-13T15:01:46Z
6个解决方案
72 votes

.Net中的IPC可以使用以下方法实现:

世界足球联合会

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

代码示例

  • WCF类NetNamedPipeBinding可以用于同一台机器上的进程间通信。 此类的MSDN文档包括覆盖此方案的代码示例。

远程处理

.Net 1.0发布的原始IPC框架。 我相信远程处理将不再得到积极发展,建议您改用WCF。

代码示例

通过远程处理进行进程间通信-使用TCP通道

资源资源

  • GenuineChannels,出售包含共享内存通道的远程处理工具包。 [http://www.genuinechannels.com/Index.aspx]
  • Ingo Rammer撰写了权威的.Net远程处理书《高级.NET远程处理》第二版

使用csharptest-net RpcLibrary的Win32 RPC

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

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

MSDN参考:

  • rpc的工作方式:[http://technet.microsoft.com/zh-cn/library/cc738291(v=ws.10).aspx]
  • RPC功能:[http://msdn.microsoft.com/zh-cn/library/aa378623(v=VS.85).aspx]

还有一个在库顶部运行的google协议缓冲区rpc客户端:[https://code.google.com/p/protobuf-csharp-rpc/]


WM_COPYDATA

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

资源资源

  • MSDN-WM_COPYDATA
  • 代码示例
  • PInvoke.net声明

插座

使用自定义协议(较难)

Edward Wilde answered 2020-01-13T15:04:07Z
6 votes

仅对于本地用户,我们已成功使用命名管道。 避免了TCP的开销,并且(至少对于.NET)效率很高,同时还具有不错的API。

Guy Starbuck answered 2020-01-13T15:04:29Z
2 votes

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

Brian Ensink answered 2020-01-13T15:04:50Z
2 votes

与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/]

Shafqat Ahmed answered 2020-01-13T15:05:24Z
0 votes

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

Larry Foulkrod answered 2020-01-13T15:05:45Z
0 votes

我想补充一下讨论。 如果这是外面的方法,请责骂我-但信号量(或多个信号量)不能用于基本的交流吗?

Nicholas Hill answered 2020-01-13T15:06:05Z
translate from https://stackoverflow.com:/questions/50153/interprocess-communication-for-windows-in-c-sharp-net-2-0