Отправка аргументов в экземпляр приложения, который находится в другом процессе - PullRequest
2 голосов
/ 23 августа 2010

У меня есть приложение для одного экземпляра (c #, WPF, .net3.51). Проверка, если приложение уже создано, выполняется с помощью Mutex. Если приложение уже запущено, я открываю новое окно из уже открытого экземпляра приложения. Это работает отлично до сих пор.

Однако из-за расширения приложения я теперь должен отправить e.Args (или, по крайней мере, его первую строку) уже запущенному экземпляру, который находится в другом процессе. Как это лучше всего сделать?

Дополнительная информация
В настоящее время я использую глобально зарегистрированное Window-сообщение, которое отправляю всем открытым приложениям через PostMessage (HWND_BROADCAST). Мое приложение ищет это сообщение и открывает новое окно, если это сообщение получено. Идея состоит в том, чтобы установить параметр PostMessage. Однако я нашел много поразительной информации по этой теме, поэтому у меня не хватило смелости пойти таким путем. Кроме того, я подумал о замене глобального вызова PostMessage с помощью другой логики активации, поскольку глобальный вызов имеет некоторые неприятные побочные эффекты.

1 Ответ

9 голосов
/ 23 августа 2010

Вы можете использовать именованные каналы, которые были добавлены в BCL в .NET 3.5.

Создайте именованный сервер канала (получатель аргумента) в уже работающем экземпляре и создайте клиент именованного канала (отправитель аргумента) в дублированном приложении. Затем отправьте аргументы от клиента на сервер.

Любой конец именованного канала может быть создан в C / C ++ при необходимости. См. Функцию Win32 CreateNamedPipe.

Ниже приведен простой пример, когда клиент и сервер работают в одной программе (приведенный ниже GUID «FD1AF2B4 ...» - это просто уникальный идентификатор, позволяющий избежать конфликта с уже существующими именованными каналами в системе). *

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