代码之家  ›  专栏  ›  技术社区  ›  HCL

向驻留在另一个进程中的应用程序实例发送参数

  •  2
  • HCL  · 技术社区  · 14 年前

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

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

    附加信息

    1 回复  |  直到 14 年前
        1
  •  10
  •   Chris Schmich    14 年前

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

    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");
            }
        }
    }