将参数发送到驻留在另一个进程中的app-instance

我有一个单实例应用程序(c#,WPF,.net3.51)。 检查应用程序是否已实例化是通过互斥锁完成的。 如果应用程序已在运行,我将从已打开的应用程序实例中打开一个新窗口。 这到目前为止工作正常。

但是由于应用程序扩展,我现在必须将e.Args(或至少它的第一个字符串)发送到驻留在另一个进程中的已经运行的实例。 这怎么做得最好?

附加信息
目前我使用全球注册的Window消息,我通过PostMessage(HWND_BROADCAST)发送给所有打开的应用程序。 如果收到此消息,我的应用程序将查找此消息并打开一个新窗口。 一个想法是设置PostMessage的参数。 然而,我发现了很多关于这个话题的令人眼花缭乱的信息,因此我没有勇气走这条路。 除此之外,我想通过另一个激活逻辑替换全局PostMessage调用,因为全局调用似乎有一些不可思议的副作用。

您可以使用命名管道,它们已添加到.NET 3.5中的BCL中。

在已经运行的实例中创建命名管道服务器(参数接收器),并在重复的应用程序中创建命名管道客户端(参数发送者)。 然后,将参数从客户端发送到服务器。

如果需要,可以在C / C ++中创建命名管道的任何一端。 请参阅Win32 CreateNamedPipe函数。

下面是一个简单的例子,客户端和服务器都运行在一个程序中(下面的“FD1AF2B4 …”GUID只是一个唯一的标识符,以避免与系统上现有的命名管道发生冲突)。

 class Program { static void Main(string[] args) { Thread writerThread = new Thread(new ThreadStart(WriterThread)); writerThread.Start(); Thread readerThread = new Thread(new ThreadStart(ReaderThread)); readerThread.Start(); } static void ReaderThread() { NamedPipeServerStream server = new NamedPipeServerStream("FD1AF2B4-575A-46E0-8DF5-8AB368CF6645"); server.WaitForConnection(); using (var reader = new BinaryReader(server)) { string arguments = reader.ReadString(); Console.WriteLine("Received: {0}", arguments); } } static void WriterThread() { NamedPipeClientStream client = new NamedPipeClientStream("FD1AF2B4-575A-46E0-8DF5-8AB368CF6645"); client.Connect(Timeout.Infinite); using (var writer = new BinaryWriter(client)) { writer.Write("/foo /bar:33 /baz:quux"); } } }