<p>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?<br />
By best I mean more robust and less error prone, not the best performance nor the easiest to code.</p>
<p>Note I'm asking about what to use, a standard TCP socket, named pipes, or some other means of communication only.</p>

[{'answer_id': 50163, 'author': 'Guy Starbuck', 'author_id': 2194, 'author_profile': 'https://Stackoverflow.com/users/2194', 'pm_score': 3, 'selected': False, 'text': '<p>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.</p>\n'}, {'answer_id': 50180, 'author': 'Edward Wilde', 'author_id': 5182, 'author_profile': 'https://Stackoverflow.com/users/5182', 'pm_score': 7, 'selected': True, 'text': '<p>IPC in .Net can be achieved using:</p>\n<h1>WCF</h1>\n<p>using named pipes <strong>requires .Net 3.0</strong> and above.</p>\n<h2>Code example</h2>\n<ul>\n<li>The WCF class <strong>NetNamedPipeBinding</strong> can be used for interprocess communication on the same machine.   The MSDN documentaion for this class includes a code sample covering this scenario <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx" rel="noreferrer">http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx</a></li>\n</ul>\n<hr />\n<h1>Remoting</h1>\n<p>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</p>\n<h2>Code example</h2>\n<p><a href="http://www.codeproject.com/KB/threads/process_communication.aspx/process_communication.aspx" rel="noreferrer">Inter-process communication via Remoting</a> - uses a tcp channel</p>\n<h2>Resources</h2>\n<ul>\n<li>GenuineChannels, sell a remoting toolkit that includes a Shared Memory Channel. <a href="http://www.genuinechannels.com/Index.aspx" rel="noreferrer">http://www.genuinechannels.com/Index.aspx</a></li>\n<li><a href="http://www.thinktecture.com/resourcearchive/tools-and-software/dotnetremotingprojects" rel="noreferrer">Ingo Rammer</a>, wrote the definitive .Net remoting book, <a href="https://rads.stackoverflow.com/amzn/click/com/1590594177" rel="noreferrer" rel="nofollow noreferrer">Advanced .NET Remoting, Second Edition </a></li>\n</ul>\n<hr />\n<h1>Win32 RPC using csharptest-net RpcLibrary</h1>\n<p>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</p>\n<p><strong>Project home page</strong>: <a href="http://csharptest.net/projects/rpclibrary/" rel="noreferrer">http://csharptest.net/projects/rpclibrary/</a></p>\n<p><strong>MSDN references:</strong></p>\n<ul>\n<li>How rpc works: <a href="http://technet.microsoft.com/en-us/library/cc738291(v=ws.10).aspx" rel="noreferrer">http://technet.microsoft.com/en-us/library/cc738291(v=ws.10).aspx</a></li>\n<li>RPC functions: <a href="http://msdn.microsoft.com/en-us/library/aa378623(v=VS.85).aspx" rel="noreferrer">http://msdn.microsoft.com/en-us/library/aa378623(v=VS.85).aspx</a></li>\n</ul>\n<p>Also has a google protocol buffers rpc client that runs on top of the library: <a href="https://code.google.com/p/protobuf-csharp-rpc/" rel="noreferrer">https://code.google.com/p/protobuf-csharp-rpc/</a></p>\n<hr />\n<h1>WM_COPYDATA</h1>\n<p>For completeness it\'s also possible to use the WIN32 method with the <a href="http://msdn.microsoft.com/en-us/library/ms649011.aspx" rel="noreferrer">WM_COPYDATA</a> message. I\'ve used this method before in .Net 1.1 to create a single instance application opening multiple files from windows explorer.</p>\n<h2>Resources</h2>\n<ul>\n<li><a href="http://msdn.microsoft.com/en-us/library/ms649011.aspx" rel="noreferrer">MSDN - WM_COPYDATA</a></li>\n<li><a href="http://www.codeproject.com/KB/cs/wm_copydata_use.aspx" rel="noreferrer">Code example</a></li>\n<li><a href="http://www.pinvoke.net/search.aspx?search=wm_copyData" rel="noreferrer">PInvoke.net declaration</a></li>\n</ul>\n<h1>Sockets</h1>\n<p>Using a custom protocol (harder)</p>\n'}, {'answer_id': 50206, 'author': 'Brian Ensink', 'author_id': 1254, 'author_profile': 'https://Stackoverflow.com/users/1254', 'pm_score': 2, 'selected': False, 'text': '<p>Since you are limited to .Net 2.0 WCF is perhaps not an option.  You could use .Net remoting with shared memory as the underlying communication mechanism between app domains on the same machine.  Using this approach you can easily put your processes on different machines and replace the shared memory protocol with a network protocol.</p>\n'}, {'answer_id': 50211, 'author': 'Larry Foulkrod', 'author_id': 1642688, 'author_profile': 'https://Stackoverflow.com/users/1642688', 'pm_score': 0, 'selected': False, 'text': '<p>Your best bet is to use WCF.  You will be able to create a service host in the windows service and expose a well defined interface that the GUI application can consume.  WCF will let you communicate via named pipes if you choose, or you can choose any other communication protocal like TCP, HTTP, etc.  Using WCF you get great tool support and lots of available information.</p>\n'}, {'answer_id': 3672030, 'author': 'Shafqat Ahmed', 'author_id': 115176, 'author_profile': 'https://Stackoverflow.com/users/115176', 'pm_score': 2, 'selected': False, 'text': '<p>The standard method of communicating with a windows service is to use service control codes. Windows services can receive codes from 0 to 255. 0-127 is reserved for system. 128 to 255 can be used for custom commands.</p>\n\n<p>If you need to send complex objects to the service use database, xml, file, tcp, http etc. Other than that for sending control commands like reload configuration, process items etc this control codes should be used. </p>\n\n<p>There are additional functionalities available such as querying the service. See Windows service documentation and api.</p>\n\n<p><a href="http://arcanecode.com/2007/05/30/windows-services-in-c-sending-commands-to-your-windows-service-part-7/" rel="nofollow noreferrer">http://arcanecode.com/2007/05/30/windows-services-in-c-sending-commands-to-your-windows-service-part-7/</a></p>\n'}, {'answer_id': 4967766, 'author': 'Nicholas Hill', 'author_id': 411903, 'author_profile': 'https://Stackoverflow.com/users/411903', 'pm_score': 0, 'selected': False, 'text': "<p>I'd like to add to this discussion. Please rebuke me if this is way out there - but couldn't a semaphore (or multiple semaphores) be used for rudimentary communication?</p>\n"}]
['https://Stackoverflow.com/questions/50153', 'https://Stackoverflow.com', 'https://Stackoverflow.com/users/5190/']