Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interprocess communication for Windows in C# (.NET 2.0)

Tags:

c#

.net

ipc

I've never had to do IPC on Windows before. I'm developing a pair of programs, a standard GUI/CLI app, and a windows service. The app has to tell the service what to do. So, assuming the communication is local only, what would be the best communication method for these two processes?
By best I mean more robust and less error prone, not the best performance nor the easiest to code.

Note I'm asking about what to use, a standard TCP socket, named pipes, or some other means of communication only.

like image 429
Vinko Vrsalovic Avatar asked Sep 08 '08 17:09

Vinko Vrsalovic


2 Answers

IPC in .Net can be achieved using:

WCF

using named pipes requires .Net 3.0 and above.

Code example

  • The WCF class NetNamedPipeBinding can be used for interprocess communication on the same machine. The MSDN documentaion for this class includes a code sample covering this scenario http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx

Remoting

The original IPC framework released with .Net 1.0. I believe remoting is no longer being actively developed, and you are encouraged to use WCF instead

Code example

Inter-process communication via Remoting - uses a tcp channel

Resources

  • GenuineChannels, sell a remoting toolkit that includes a Shared Memory Channel. http://www.genuinechannels.com/Index.aspx
  • Ingo Rammer, wrote the definitive .Net remoting book, Advanced .NET Remoting, Second Edition

Win32 RPC using csharptest-net RpcLibrary

I came across a project recently that has wrapped the Win32 RPC library and created a .net class library that can be used for local and remote RPC

Project home page: http://csharptest.net/projects/rpclibrary/

MSDN references:

  • How rpc works: http://technet.microsoft.com/en-us/library/cc738291(v=ws.10).aspx
  • RPC functions: http://msdn.microsoft.com/en-us/library/aa378623(v=VS.85).aspx

Also has a google protocol buffers rpc client that runs on top of the library: https://code.google.com/p/protobuf-csharp-rpc/


WM_COPYDATA

For completeness it's also possible to use the WIN32 method with the WM_COPYDATA message. I've used this method before in .Net 1.1 to create a single instance application opening multiple files from windows explorer.

Resources

  • MSDN - WM_COPYDATA
  • Code example
  • PInvoke.net declaration

Sockets

Using a custom protocol (harder)

like image 170
Edward Wilde Avatar answered Sep 23 '22 02:09

Edward Wilde


For local only, we have had success using Named Pipes. Avoids the overhead of TCP, and is pretty much (at least for .NET) as efficient as you can get while also having a decent API to work with.

like image 42
Guy Starbuck Avatar answered Sep 26 '22 02:09

Guy Starbuck