Какой самый простой способ сделать межпроцессное взаимодействие в C #? - PullRequest
15 голосов
/ 26 ноября 2009

У меня есть два приложения на C #, и я хочу, чтобы одно из них отправляло два целых числа другому (это не должно быть быстрым, поскольку оно вызывается только раз в несколько секунд).

Какой самый простой способ сделать это? (Он не должен быть самым элегантным.)

Ответы [ 8 ]

18 голосов
/ 26 ноября 2009

Самый простой и надежный способ - это почти наверняка IpcChannel (например, межпроцессный канал связи); вот для чего это. Вы можете запустить его с помощью нескольких строк кода и конфигурации.

5 голосов
/ 26 ноября 2009

Вы можете попробовать .NET Remoting. Вот простой пример: CodeProject .NET Remoting .

Если вы используете .NET 3.5, вы должны пойти на WCF, поскольку удаленное взаимодействие постепенно устареет. Опять же, существует множество примеров для WCF .

2 голосов
/ 13 декабря 2009

Я создал собственную библиотеку с открытым исходным кодом для быстрой и простой IPC, которая работает между службами Windows, консольными приложениями и формами Windows.

Он имеет некоторые преимущества перед существующими реализациями IPC и не требует какой-либо настройки.

См. здесь .

0 голосов
/ 24 марта 2019

Я не профессионал, но увидеть шаблон проектирования наблюдателя с StreamInsight представляется наиболее желательным вариантом, но он имеет ограничения при больших нагрузках в многопоточных приложениях (вы получите слишком много переключений контекста).

Как программист-любитель, я обнаружил, что XDMessaging - это легко и просто для меня. Это в NuGet так легко установить, веб-сайт XDMessaging

0 голосов
/ 05 января 2019

Я создал простой класс, который использует класс IpcChannel для взаимодействия между процессами. Вот ссылка на Gist на GitHub .

Код серверной стороны:



       IpcClientServer ipcClientServer = new IpcClientServer();
       ipcClientServer.CreateServer("localhost", 9090);

       IpcClientServer.RemoteMessage.MessageReceived += IpcClientServer_MessageReceived;
    
    

Прослушиватель событий:


    private void IpcClientServer_MessageReceived(object sender, MessageReceivedEventArgs e)
    {
        if (InvokeRequired)
        {
            Invoke(new MethodInvoker(delegate { textBox2.Text += e.Message + 
            Environment.NewLine; }));
        }
        else
        {
            textBox2.Text += e.Message + Environment.NewLine;
        }
    }


Клиент:



        if (ipcClientServer == null)
        {
            ipcClientServer = new IpcClientServer();
            ipcClientServer.CreateClient("localhost", 9090);
        }
        ipcClientServer.SendMessage(textBox1.Text);


Примечание. Требуется ссылка на System.Runtime.Remoting.

0 голосов
/ 26 ноября 2009

Для полноты вы также можете использовать net.pipe и WCF.

0 голосов
/ 26 ноября 2009

Другим способом было бы имитировать именованную трубу. Объявите файл где-нибудь и прочитайте / напишите в него.

Или, если программы выполняются последовательно, вы можете попробовать буфер обмена ... но это решение ужасно уродливо и ошибочно (иногда .NET не может получить доступ к буферу обмена без причины).

0 голосов
/ 26 ноября 2009

Я бы сказал, заставить их говорить через сокет.

В сокете есть одна программа listen, а в другой - connect. Отправьте два целых числа в одну строку в виде строк цифр.

Единственный вопрос - как им согласовать номера портов и как они знают, что разговаривают друг с другом. Они могут договориться о номерах портов, если вы решите, что они всегда должны использовать порт 12345 (скажем), и грязное хакерское решение для второй части состоит в том, чтобы просто довериться тому, с кем вы говорите, быть хорошим парнем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...