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

HCL*_*HCL 3 .net c# wpf winapi ipc

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

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

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

Chr*_*ich 10

您可以使用命名管道,它们已添加到.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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)