/// <summary> /// Uses a named pipe to send the currently parsed options to an already running /// instance. /// </summary> /// <param name="namedPipePayload"></param> private static void NamedPipeClientSendOptions(AppPayload namedPipePayload) { try { using (var namedPipeClientStream = new NamedPipeClientStream(".", GetPipeName(), PipeDirection.Out)) { namedPipeClientStream.Connect(3000); // Maximum wait 3 seconds var ser = new DataContractJsonSerializer(typeof(AppPayload)); ser.WriteObject(namedPipeClientStream, namedPipePayload); } } catch (Exception) { // Error connecting or sending } }
/// <summary> /// Determines if the application should continue launching or return because it's not /// the first instance. When not the first instance, the command line args will be passed to the /// first one. /// </summary> /// <param name="otherInstanceCallback"> /// Callback to execute on the first instance with command /// line args from subsequent launches. Will not run on the main thread, marshalling may be /// required. /// </param> /// <param name="args">Arguments from Main()</param> /// <returns>true if the first instance, false if it's not the first instance.</returns> public static bool IsOnlyInstance(Action <string[]> otherInstanceCallback, string[] args) { _otherInstanceCallback = otherInstanceCallback ?? throw new ArgumentNullException(nameof(otherInstanceCallback)); if (IsApplicationFirstInstance()) { _syncContext = SynchronizationContext.Current; // Setup Named Pipe listener NamedPipeServerCreateServer(); return(true); } else { // We are not the first instance, send the named pipe message with our payload and stop loading var namedPipeXmlPayload = new AppPayload { CommandLineArguments = Environment.GetCommandLineArgs().ToList() }; // Send the message NamedPipeClientSendOptions(namedPipeXmlPayload); return(false); // Signal to quit } }