{"id":2046,"date":"2018-07-04T12:22:00","date_gmt":"2018-07-04T11:22:00","guid":{"rendered":"https:\/\/www.autoitconsulting.com\/site\/?p=2046"},"modified":"2025-07-26T09:27:40","modified_gmt":"2025-07-26T08:27:40","slug":"single-instance-winform-app-csharp-mutex-named-pipes","status":"publish","type":"post","link":"https:\/\/www.autoitconsulting.com\/site\/development\/single-instance-winform-app-csharp-mutex-named-pipes\/","title":{"rendered":"Single Instance WinForm App in C# with Mutex and Named Pipes"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Overview<\/h2>\n\n\n\n<p>This post shows how to create a single instance WinForm C# application using a Mutex. It also demonstrates how to send any object between instances with Named Pipes.<\/p>\n\n\n\n<p>While writing <a href=\"https:\/\/www.autoitconsulting.com\/site\/software\/osd-background\/\" target=\"_blank\" rel=\"noopener\">OSD Background<\/a> I wanted an application that would only allow a single instance to run at any given time. In addition I wanted it so that if another instance was executed with different parameters &#8211; or a quit request &#8211; then those parameters would be sent to the original instance so that it could process them. After sending the parameters the second instance would terminate.<\/p>\n\n\n\n<p>The final solution I came up with uses a <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/standard\/threading\/mutexes\" target=\"_blank\" rel=\"noopener\">Mutex<\/a> to handle the single instancing. The information I wanted to send between instances is wrapped into a &#8216;payload&#8217; object that is <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/programming-guide\/concepts\/serialization\/\" target=\"_blank\" rel=\"noopener\">serialized<\/a> into XML and sent over a <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/standard\/io\/how-to-use-named-pipes-for-network-interprocess-communication\" target=\"_blank\" rel=\"noopener\">Named Pipe<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Downloads<\/h2>\n\n\n\n<p>A fully working example can be downloaded from GitHub at&nbsp;<a href=\"https:\/\/github.com\/AutoItConsulting\/examples-csharp\/tree\/master\/MutexSingleInstanceAndNamedPipe\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/AutoItConsulting\/examples-csharp\/tree\/master\/MutexSingleInstanceAndNamedPipe<br><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1226 size-full\" src=\"\/site\/wp-content\/uploads\/2018\/06\/download_github_106x51@2x.png\" alt=\"Download ZIP Icon @2x\" width=\"106\" height=\"102\"><\/a><\/p>\n\n\n\n<p>On first run the application shows a simple WinForm application with an empty text box. When another attempt is made to run the application the command-line parameters are sent via a Named Pipe to the first instance and shown in the text box.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Single Instance Using a Mutex<\/h2>\n\n\n\n<p>Mutex is a simple object, you just pick a unique instance name and create a new object. A bool is returned that allows you to test if this mutex is owned by just the current process or if it is already in use. As long as the mutex is referenced other processes that request a new Mutex object will be able to see that another instance is running. In the code below I request the Mutex in the form Load event, and release it in the form Close event.<\/p>\n\n\n\n<p><strong>Note:<\/strong> It is critical to reference the Mutex object right at the end of your program&#8217;s execution rather than relying on the garbage collector to clean up after your program exits. Otherwise in a&nbsp;<strong>release<\/strong> build the compiler is clever enough to see that after your initial creation of the Mutex object you never use it again and will signal for it to be disposed <strong>before<\/strong> your program has exited. Of course, Mutex implements the&nbsp;<strong>IDisposable<\/strong> interface so it&#8217;s good practice to explicitly dispose it anyway. This explicit dispose in the Form Close event is enough to prevent the compiler from automatically disposing the Mutex earlier.<\/p>\n\n\n\n<p>Here are the relevant functions:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">C#<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public partial class FormMain : Form\n{\n    private const string MutexName = \"MUTEX_SINGLEINSTANCEANDNAMEDPIPE\";\n    private bool _firstApplicationInstance;\n    private Mutex _mutexApplication;\n\n    private bool IsApplicationFirstInstance()\n    {\n        \/\/ Allow for multiple runs but only try and get the mutex once\n        if (_mutexApplication == null)\n        {\n            _mutexApplication = new Mutex(true, MutexName, out _firstApplicationInstance);\n        }\n\n        return _firstApplicationInstance;\n    }\n    \n    private void FormMain_Load(object sender, EventArgs e)\n    {\n        \/\/ First instance\n        if (IsApplicationFirstInstance())\n        {\n            \/\/ Yes\n            \/\/ Do something\n        }\n        else\n        {\n            \/\/ Close down\n            Close();\n        }\n    }\n    \n    private void FormMain_FormClosed(object sender, FormClosedEventArgs e)\n    {\n        \/\/ Close and dispose our mutex.\n        if (_mutexApplication != null)\n        {\n            _mutexApplication.Dispose();\n        }\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">partial<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">FormMain<\/span><span style=\"color: #D4D4D4\"> : <\/span><span style=\"color: #4EC9B0\">Form<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">MutexName<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;MUTEX_SINGLEINSTANCEANDNAMEDPIPE&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_firstApplicationInstance<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Mutex<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_mutexApplication<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">IsApplicationFirstInstance<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">        \/\/ Allow for multiple runs but only try and get the mutex once<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">_mutexApplication<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">_mutexApplication<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Mutex<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">MutexName<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">out<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_firstApplicationInstance<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_firstApplicationInstance<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">FormMain_Load<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sender<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">EventArgs<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">e<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">        \/\/ First instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #DCDCAA\">IsApplicationFirstInstance<\/span><span style=\"color: #D4D4D4\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ Yes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ Do something<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ Close down<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">Close<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">FormMain_FormClosed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sender<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">FormClosedEventArgs<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">e<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">        \/\/ Close and dispose our mutex.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">_mutexApplication<\/span><span style=\"color: #D4D4D4\"> != <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">_mutexApplication<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Dispose<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Communication Payload<\/h2>\n\n\n\n<p>The &#8216;payload&#8217; is the data I wanted to send between instances. In this example I used a custom object that has a copy of the command-line parameters used in the form of a <strong>List&lt;string&gt;<\/strong>. I am using the <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/system.xml.serialization.xmlserializer(v=vs.110).aspx\" target=\"_blank\" rel=\"noopener\">XmlSerializer<\/a> so I&#8217;ve decorated the class with XML attributes. The <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/system.runtime.serialization.formatters.binary.binaryformatter(v=vs.110).aspx\" target=\"_blank\" rel=\"noopener\">BinaryFormatter<\/a> (or any other serializer) could also be used in the same way. I chose XmlSerializer because in my <a href=\"https:\/\/www.autoitconsulting.com\/site\/software\/osd-background\/\" target=\"_blank\" rel=\"noopener\">OSD Background<\/a> application I use it to send a copy of an XML options file.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">C#<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public class NamedPipeXmlPayload\n{\n    \/\/\/ &lt;summary>\n    \/\/\/     A list of command line arguments.\n    \/\/\/ &lt;\/summary>\n    &#91;XmlElement(\"CommandLineArguments\")&#93;\n    public List&lt;string> CommandLineArguments { get; set; } = new List&lt;string>();\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">NamedPipeXmlPayload<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/\/ <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">summary<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/\/     A list of command line arguments.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/\/ <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">summary<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &#91;<\/span><span style=\"color: #4EC9B0\">XmlElement<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;CommandLineArguments&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">List<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #9CDCFE\">CommandLineArguments<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #569CD6\">get<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\">; } = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">List<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">&gt;();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Named Pipe Server<\/h2>\n\n\n\n<p>We create a single Named Pipe server which does the following.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creates a new Named Pipe server and <strong>asynchronously<\/strong> waits for a client to connect ( <strong>NamedPipeCreateServer()<\/strong> )<\/li>\n\n\n\n<li>On client connection reads payload sent from the client ( <strong>NamedPipeServerConnectionCallback()<\/strong> )<\/li>\n\n\n\n<li>De-serializes the payload into our custom NamedPipeXmlPayload object&nbsp;( <strong>NamedPipeServerConnectionCallback()<\/strong> )<\/li>\n\n\n\n<li>Create a new Named Pipe server and repeats&nbsp;( <strong>NamedPipeCreateServer()<\/strong> )<\/li>\n<\/ul>\n\n\n\n<p>By default a Named Pipe can be accessed from the network as well as local machine. I don&#8217;t want that so I explicitly create a Named Pipe that denies network access.<\/p>\n\n\n\n<p><strong>Note:<\/strong> The NamedPipeServerConnectionCallback method takes place on a new thread. If you want to interact with the UI thread you will need to use the appropriate methods. In this example I update the text box in the UI thread using the <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/zyzhdc6b(v=vs.110).aspx\" target=\"_blank\" rel=\"noreferrer noopener\">Invoke<\/a> functionality.<\/p>\n\n\n\n<p>The code for all the relevant functions is below:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">C#<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public partial class FormMain : Form\n{\n\tprivate const string PipeName = \"PIPE_SINGLEINSTANCEANDNAMEDPIPE\";\n\tprivate readonly object _namedPiperServerThreadLock = new object();\n\tprivate NamedPipeServerStream _namedPipeServerStream;\n\tprivate NamedPipeXmlPayload _namedPipeXmlPayload;\n\n\tprivate void FormMain_FormClosed(object sender, FormClosedEventArgs e)\n\t{\n\t\t\/\/ Dispose the named pipe steam\n\t\tif (_namedPipeServerStream != null)\n\t\t{\n\t\t\t_namedPipeServerStream.Dispose();\n\t\t}\n\t}\n\n\tprivate void FormMain_Load(object sender, EventArgs e)\n\t{\n\t\t\/\/ If are the first instance then we start the named pipe server listening and allow the form to load\n\t\tif (IsApplicationFirstInstance())\n\t\t{\n\t\t\t\/\/ Create a new pipe - it will return immediately and async wait for connections\n\t\t\tNamedPipeServerCreateServer();\n\t\t}\n\t}\n\n\t\/\/\/ &lt;summary>\n\t\/\/\/     Starts a new pipe server if one isn't already active.\n\t\/\/\/ &lt;\/summary>\n\tprivate void NamedPipeServerCreateServer()\n\t{\n\t\t\/\/ Create a new pipe accessible by local authenticated users, disallow network\n\t\tvar sidNetworkService = new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null);\n\t\tvar sidWorld = new SecurityIdentifier(WellKnownSidType.WorldSid, null);\n\n\t\tvar pipeSecurity = new PipeSecurity();\n\n\t\t\/\/ Deny network access to the pipe\n\t\tvar accessRule = new PipeAccessRule(sidNetworkService, PipeAccessRights.ReadWrite, AccessControlType.Deny);\n\t\tpipeSecurity.AddAccessRule(accessRule);\n\n\t\t\/\/ Alow Everyone to read\/write\n\t\taccessRule = new PipeAccessRule(sidWorld, PipeAccessRights.ReadWrite, AccessControlType.Allow);\n\t\tpipeSecurity.AddAccessRule(accessRule);\n\n\t\t\/\/ Current user is the owner\n\t\tSecurityIdentifier sidOwner = WindowsIdentity.GetCurrent().Owner;\n\t\tif (sidOwner != null)\n\t\t{\n\t\t\taccessRule = new PipeAccessRule(sidOwner, PipeAccessRights.FullControl, AccessControlType.Allow);\n\t\t\tpipeSecurity.AddAccessRule(accessRule);\n\t\t}\n\n\t\t\/\/ Create pipe and start the async connection wait\n\t\t_namedPipeServerStream = new NamedPipeServerStream(\n\t\t\tPipeName,\n\t\t\tPipeDirection.In,\n\t\t\t1,\n\t\t\tPipeTransmissionMode.Byte,\n\t\t\tPipeOptions.Asynchronous,\n\t\t\t0,\n\t\t\t0,\n\t\t\tpipeSecurity);\n\n\t\t\/\/ Begin async wait for connections\n\t\t_namedPipeServerStream.BeginWaitForConnection(NamedPipeServerConnectionCallback, _namedPipeServerStream);\n\t}\n\n\t\/\/\/ &lt;summary>\n\t\/\/\/     The function called when a client connects to the named pipe. Note: This method is called on a non-UI thread.\n\t\/\/\/ &lt;\/summary>\n\t\/\/\/ &lt;param name=\"iAsyncResult\">&lt;\/param>\n\tprivate void NamedPipeServerConnectionCallback(IAsyncResult iAsyncResult)\n\t{\n\t\ttry\n\t\t{\n\t\t\t\/\/ End waiting for the connection\n\t\t\t_namedPipeServerStream.EndWaitForConnection(iAsyncResult);\n\n\t\t\t\/\/ Read data and prevent access to _namedPipeXmlPayload during threaded operations\n\t\t\tlock (_namedPiperServerThreadLock)\n\t\t\t{\n\t\t\t\t\/\/ Read data from client\n\t\t\t\tvar xmlSerializer = new XmlSerializer(typeof(NamedPipeXmlPayload));\n\t\t\t\t_namedPipeXmlPayload = (NamedPipeXmlPayload)xmlSerializer.Deserialize(_namedPipeServerStream);\n\n\t\t\t\t\/\/ _namedPipeXmlPayload contains the data sent from the other instance\n\t\t\t\t\/\/ As an example output it to the textbox\n\t\t\t\t\/\/ In more complicated cases would need to do some processing here and possibly pass to UI thread\n\t\t\t\tTextBoxAppend(_namedPipeXmlPayload);\n\t\t\t}\n\t\t}\n\t\tcatch (ObjectDisposedException)\n\t\t{\n\t\t\t\/\/ EndWaitForConnection will exception when someone closes the pipe before connection made\n\t\t\t\/\/ In that case we dont create any more pipes and just return\n\t\t\t\/\/ This will happen when app is closing and our pipe is closed\/disposed\n\t\t\treturn;\n\t\t}\n\t\tcatch (Exception)\n\t\t{\n\t\t\t\/\/ ignored\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\t\/\/ Close the original pipe (we will create a new one each time)\n\t\t\t_namedPipeServerStream.Dispose();\n\t\t}\n\n\t\t\/\/ Create a new pipe for next connection\n\t\tNamedPipeServerCreateServer();\n\t}\n\t\n\t\/\/\/ &lt;summary>\n\t\/\/\/     Appends string version of the payload to the end of the text box. Handles being called from a non UI thread.\n\t\/\/\/ &lt;\/summary>\n\tprivate void TextBoxAppend(NamedPipeXmlPayload namedPipeXmlPayload)\n\t{\n\t\tif (textBoxOutput.InvokeRequired)\n\t\t{\n\t\t\ttextBoxOutput.Invoke((MethodInvoker)delegate { TextBoxAppend(namedPipeXmlPayload); });\n\t\t\treturn;\n\t\t}\n\n\t\tforeach (string commandLine in namedPipeXmlPayload.CommandLineArguments)\n\t\t{\n\t\t\tmessage += \"\\r\\nCommandLine: \" + commandLine;\n\t\t}\n\n\t\ttextBoxOutput.Text += message + \"\\r\\n\\r\\n\";\n\t}\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">partial<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">FormMain<\/span><span style=\"color: #D4D4D4\"> : <\/span><span style=\"color: #4EC9B0\">Form<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">PipeName<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;PIPE_SINGLEINSTANCEANDNAMEDPIPE&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">readonly<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_namedPiperServerThreadLock<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">NamedPipeServerStream<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_namedPipeServerStream<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">NamedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_namedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">FormMain_FormClosed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sender<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">FormClosedEventArgs<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">e<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\/\/ Dispose the named pipe steam<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">_namedPipeServerStream<\/span><span style=\"color: #D4D4D4\"> != <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">_namedPipeServerStream<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Dispose<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">FormMain_Load<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sender<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">EventArgs<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">e<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\/\/ If are the first instance then we start the named pipe server listening and allow the form to load<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #DCDCAA\">IsApplicationFirstInstance<\/span><span style=\"color: #D4D4D4\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\/\/ Create a new pipe - it will return immediately and async wait for connections<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #DCDCAA\">NamedPipeServerCreateServer<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\/\/\/ <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">summary<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\/\/\/     Starts a new pipe server if one isn&#39;t already active.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\/\/\/ <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">summary<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">NamedPipeServerCreateServer<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t{<\/span><\/span>\n<span class=\"line cbp-see-more-line \"><span style=\"color: #6A9955\">\t\t\/\/ Create a new pipe accessible by local authenticated users, disallow network<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sidNetworkService<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SecurityIdentifier<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">WellKnownSidType<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">NetworkServiceSid<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sidWorld<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SecurityIdentifier<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">WellKnownSidType<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">WorldSid<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">pipeSecurity<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">PipeSecurity<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\/\/ Deny network access to the pipe<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">accessRule<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">PipeAccessRule<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">sidNetworkService<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">PipeAccessRights<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">ReadWrite<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">AccessControlType<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Deny<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #9CDCFE\">pipeSecurity<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">AddAccessRule<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">accessRule<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\/\/ Alow Everyone to read\/write<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #9CDCFE\">accessRule<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">PipeAccessRule<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">sidWorld<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">PipeAccessRights<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">ReadWrite<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">AccessControlType<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Allow<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #9CDCFE\">pipeSecurity<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">AddAccessRule<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">accessRule<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\/\/ Current user is the owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #4EC9B0\">SecurityIdentifier<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sidOwner<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">WindowsIdentity<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">GetCurrent<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #9CDCFE\">Owner<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">sidOwner<\/span><span style=\"color: #D4D4D4\"> != <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">accessRule<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">PipeAccessRule<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">sidOwner<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">PipeAccessRights<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">FullControl<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">AccessControlType<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Allow<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">pipeSecurity<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">AddAccessRule<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">accessRule<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\/\/ Create pipe and start the async connection wait<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #9CDCFE\">_namedPipeServerStream<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">NamedPipeServerStream<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">PipeName<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">PipeDirection<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">In<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">PipeTransmissionMode<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Byte<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">PipeOptions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Asynchronous<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">pipeSecurity<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\/\/ Begin async wait for connections<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #9CDCFE\">_namedPipeServerStream<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">BeginWaitForConnection<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">NamedPipeServerConnectionCallback<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">_namedPipeServerStream<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\/\/\/ <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">summary<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\/\/\/     The function called when a client connects to the named pipe. Note: This method is called on a non-UI thread.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\/\/\/ <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">summary<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\/\/\/ <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #6A9955\">=<\/span><span style=\"color: #CE9178\">&quot;iAsyncResult&quot;<\/span><span style=\"color: #808080\">&gt;&lt;\/<\/span><span style=\"color: #569CD6\">param<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">NamedPipeServerConnectionCallback<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">IAsyncResult<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">iAsyncResult<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #C586C0\">try<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\/\/ End waiting for the connection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">_namedPipeServerStream<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">EndWaitForConnection<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">iAsyncResult<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\/\/ Read data and prevent access to _namedPipeXmlPayload during threaded operations<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #C586C0\">lock<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">_namedPiperServerThreadLock<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\t\/\/ Read data from client<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t\t<\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">xmlSerializer<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">XmlSerializer<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">NamedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t\t<\/span><span style=\"color: #9CDCFE\">_namedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #4EC9B0\">NamedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #9CDCFE\">xmlSerializer<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Deserialize<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">_namedPipeServerStream<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\t\/\/ _namedPipeXmlPayload contains the data sent from the other instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\t\/\/ As an example output it to the textbox<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\t\/\/ In more complicated cases would need to do some processing here and possibly pass to UI thread<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t\t<\/span><span style=\"color: #DCDCAA\">TextBoxAppend<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">_namedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #4EC9B0\">ObjectDisposedException<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\/\/ EndWaitForConnection will exception when someone closes the pipe before connection made<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\/\/ In that case we dont create any more pipes and just return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\/\/ This will happen when app is closing and our pipe is closed\/disposed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #4EC9B0\">Exception<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\/\/ ignored<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #C586C0\">finally<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\t\/\/ Close the original pipe (we will create a new one each time)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">_namedPipeServerStream<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Dispose<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\t\/\/ Create a new pipe for next connection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #DCDCAA\">NamedPipeServerCreateServer<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\/\/\/ <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">summary<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\/\/\/     Appends string version of the payload to the end of the text box. Handles being called from a non UI thread.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\t\/\/\/ <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">summary<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">TextBoxAppend<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">NamedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">namedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">textBoxOutput<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">InvokeRequired<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">textBoxOutput<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Invoke<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #4EC9B0\">MethodInvoker<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #569CD6\">delegate<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #DCDCAA\">TextBoxAppend<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">namedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\">); });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #C586C0\">foreach<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">commandLine<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">namedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CommandLineArguments<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t\t<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D7BA7D\">\\r\\n<\/span><span style=\"color: #CE9178\">CommandLine: &quot;<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">commandLine<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t\t<\/span><span style=\"color: #9CDCFE\">textBoxOutput<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Text<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D7BA7D\">\\r\\n\\r\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><div class=\"cbp-see-more-container\" style=\"display:flex;flex-direction:column;align-items:center;width:100%;font-size:12px;line-height:1;position:relative;padding-top:4px;margin-bottom:-16px;height:32px\"><div style=\"background-color:#1e1e1e;height:50%;position:absolute;top:0;left:0;right:0\" aria-hidden=\"true\"><\/div><span role=\"button\" tabindex=\"0\" class=\"cbp-see-more-simple-btn cbp-see-more-simple-btn-hover\" style=\"color:#fafafa;background-color:#373737;padding:6px 14px;cursor:default;position:relative;border-radius:6px\">Expand<\/span><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Named Pipe Client<\/h2>\n\n\n\n<p>The code for the Named Pipe client operations are much more simple:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Check if first instance of application, if not prepare client message ( <strong>FormMain_Load()<\/strong> )<\/li>\n\n\n\n<li>Add command-line parameters to our custom payload object ( <strong>FormMain_Load()<\/strong> )<\/li>\n\n\n\n<li>Connect to the Named Pipe and send the payload ( <strong>NamedPipeClientSendOptions()<\/strong> )<\/li>\n\n\n\n<li>Close application<\/li>\n<\/ul>\n\n\n\n<p>The code is below:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">C#<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public partial class FormMain : Form\n{\n    private const string PipeName = \"PIPE_SINGLEINSTANCEANDNAMEDPIPE\";\n    private NamedPipeServerStream _namedPipeServerStream;\n    private NamedPipeXmlPayload _namedPipeXmlPayload;\n\n    private void FormMain_Load(object sender, EventArgs e)\n    {\n        \/\/ If are the first instance then we start the named pipe server listening and allow the form to load\n        if (IsApplicationFirstInstance())\n        {\n            \/\/ Create a new pipe - it will return immediately and async wait for connections\n            NamedPipeServerCreateServer();\n        }\n        else\n        {\n            \/\/ We are not the first instance, send the named pipe message with our payload and stop loading\n            var namedPipeXmlPayload = new NamedPipeXmlPayload\n            {\n                CommandLineArguments = Environment.GetCommandLineArgs().ToList()\n            };\n\n            \/\/ Send the message\n            NamedPipeClientSendOptions(namedPipeXmlPayload);\n\n            \/\/ Stop loading form and quit\n            Close();\n        }\n    }\n\n    \/\/\/ &lt;summary>\n    \/\/\/     Uses a named pipe to send the currently parsed options to an already running instance.\n    \/\/\/ &lt;\/summary>\n    \/\/\/ &lt;param name=\"namedPipePayload\">&lt;\/param>\n    private void NamedPipeClientSendOptions(NamedPipeXmlPayload namedPipePayload)\n    {\n        try\n        {\n            using (var namedPipeClientStream = new NamedPipeClientStream(\".\", PipeName, PipeDirection.Out))\n            {\n                namedPipeClientStream.Connect(3000); \/\/ Maximum wait 3 seconds\n\n                var xmlSerializer = new XmlSerializer(typeof(NamedPipeXmlPayload));\n                xmlSerializer.Serialize(namedPipeClientStream, namedPipePayload);\n            }\n        }\n        catch (Exception)\n        {\n            \/\/ Error connecting or sending\n        }\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">partial<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">FormMain<\/span><span style=\"color: #D4D4D4\"> : <\/span><span style=\"color: #4EC9B0\">Form<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">PipeName<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;PIPE_SINGLEINSTANCEANDNAMEDPIPE&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">NamedPipeServerStream<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_namedPipeServerStream<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">NamedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_namedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">FormMain_Load<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sender<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">EventArgs<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">e<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">        \/\/ If are the first instance then we start the named pipe server listening and allow the form to load<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #DCDCAA\">IsApplicationFirstInstance<\/span><span style=\"color: #D4D4D4\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ Create a new pipe - it will return immediately and async wait for connections<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">NamedPipeServerCreateServer<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ We are not the first instance, send the named pipe message with our payload and stop loading<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">namedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">NamedPipeXmlPayload<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">CommandLineArguments<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Environment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">GetCommandLineArgs<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">ToList<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ Send the message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">NamedPipeClientSendOptions<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">namedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ Stop loading form and quit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">Close<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/\/ <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">summary<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/\/     Uses a named pipe to send the currently parsed options to an already running instance.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/\/ <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">summary<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/\/ <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #6A9955\">=<\/span><span style=\"color: #CE9178\">&quot;namedPipePayload&quot;<\/span><span style=\"color: #808080\">&gt;&lt;\/<\/span><span style=\"color: #569CD6\">param<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">NamedPipeClientSendOptions<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">NamedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">namedPipePayload<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">try<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">using<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">namedPipeClientStream<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">NamedPipeClientStream<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;.&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">PipeName<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">PipeDirection<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Out<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">namedPipeClientStream<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Connect<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">3000<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #6A9955\">\/\/ Maximum wait 3 seconds<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">xmlSerializer<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">XmlSerializer<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">NamedPipeXmlPayload<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">xmlSerializer<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Serialize<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">namedPipeClientStream<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">namedPipePayload<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #4EC9B0\">Exception<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ Error connecting or sending<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Downloads<\/h2>\n\n\n\n<p>A fully working example can be downloaded from GitHub at&nbsp;<a href=\"https:\/\/github.com\/AutoItConsulting\/examples-csharp\/tree\/master\/MutexSingleInstanceAndNamedPipe\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/AutoItConsulting\/examples-csharp\/tree\/master\/MutexSingleInstanceAndNamedPipe<br><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1226 size-full\" src=\"\/site\/wp-content\/uploads\/2018\/06\/download_github_106x51@2x.png\" alt=\"Download ZIP Icon @2x\" width=\"106\" height=\"102\"><\/a><\/p>\n\n\n\n<p>On first run the application shows a simple WinForm application with an empty text box. When another attempt is made to run the application the command-line parameters are sent via a Named Pipe to the first instance and shown in the text box.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Overview This post shows how to create a single instance WinForm C# application using a Mutex. It also demonstrates how to send any object between instances with Named Pipes. While writing OSD Background I wanted an application that would only allow a single instance to run at any given time. In addition I wanted it [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2049,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[53,90],"class_list":["post-2046","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-csharp","tag-development"],"_links":{"self":[{"href":"https:\/\/www.autoitconsulting.com\/site\/wp-json\/wp\/v2\/posts\/2046","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.autoitconsulting.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.autoitconsulting.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.autoitconsulting.com\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.autoitconsulting.com\/site\/wp-json\/wp\/v2\/comments?post=2046"}],"version-history":[{"count":17,"href":"https:\/\/www.autoitconsulting.com\/site\/wp-json\/wp\/v2\/posts\/2046\/revisions"}],"predecessor-version":[{"id":100141,"href":"https:\/\/www.autoitconsulting.com\/site\/wp-json\/wp\/v2\/posts\/2046\/revisions\/100141"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.autoitconsulting.com\/site\/wp-json\/wp\/v2\/media\/2049"}],"wp:attachment":[{"href":"https:\/\/www.autoitconsulting.com\/site\/wp-json\/wp\/v2\/media?parent=2046"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.autoitconsulting.com\/site\/wp-json\/wp\/v2\/categories?post=2046"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.autoitconsulting.com\/site\/wp-json\/wp\/v2\/tags?post=2046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}