Ответ 1
Самый простой и надежный способ - это почти IpcChannel (a.k.a. Inter Process Communication Channel); что что это там для. Вы можете запустить его и запустить с помощью нескольких строк кода и конфигурации.
У меня есть два приложения С#, и я хочу, чтобы один из них отправил два целых числа в другое (это не должно быть быстрым, поскольку он вызывается только один раз в несколько секунд).
Какой самый простой способ сделать это? (Он не должен быть самым элегантным.)
Самый простой и надежный способ - это почти IpcChannel (a.k.a. Inter Process Communication Channel); что что это там для. Вы можете запустить его и запустить с помощью нескольких строк кода и конфигурации.
Вы можете попробовать .NET Remoting. Вот простой пример: Удаление кода .NET.NET.
Если вы используете .NET 3.5, вы должны пойти на WCF, так как Remoting медленно устаревает. Опять же, есть много примеров для WCF вокруг.
Я создал свою собственную библиотеку с открытым исходным кодом для быстрого и простого IPC, который работает между службами Windows, консольными приложениями и форматами Windows.
Он имеет некоторые преимущества перед существующими реализациями IPC и не требует какой-либо конфигурации.
Смотрите здесь.
Я бы сказал, чтобы они разговаривали через сокет.
Есть одна программа listen
в сокете, а вторая connect
- первая. Отправьте два целых числа в одной строке, как строки цифр.
Вопрос только в том, как они должны согласовывать номера портов и как они знают, что они разговаривают друг с другом. Они могут договориться о номерах портов, решив, что они всегда должны использовать порт 12345 (скажем), а грязно-хакерское решение для второй части - просто доверять тому, с кем вы разговариваете, чтобы быть хорошим парнем.
Другой способ - подражать именованному каналу. Объявите файл где-нибудь и прочитайте его/напишите ему.
Или, если программы выполняются последовательно, вы можете попробовать буфер обмена... но это решение является уродливым, как черт, и является ошибкой (иногда .NET не может получить доступ к буферу без каких-либо причин).
Для полноты вы также можете использовать net.pipe
и WCF
.
Я создал простой класс, который использует класс 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 обязательна.