.net процесс тыкает друг другу? - PullRequest
4 голосов
/ 03 октября 2011

Используя .net и без использования какой-либо платформы, есть ли способ заставить два моих приложения ткнуть друг друга? Оба приложения будут запущены. Это определенно будет одним способом тыкать. Мне нужно будет передать ему значение int64 минимум. Он будет работать на Linux с моно, но я буду разрабатывать на Windows

-edit- дополнительная информация. Один процесс будет asp.net, так что я не могу долго ждать. Время жизни будет <50 мс, потому что это запрос страницы. Также у меня может быть любой запрос на запись / запись в минуту или один раз каждые 10 + минут </p>

Ответы [ 4 ]

1 голос
/ 03 октября 2011

Вы можете использовать WCF (предполагается, что он является частью основного стека для Mono) - см. этот вопрос .

Также вы можете использовать обмен сообщениями, например, JMS. Apache ActiveMQ поддерживает клиенты C #. (Мы исследуем это, но еще не пробовали в производстве.)

Любое из этих решений может работать, даже если процессы выполняются на разных машинах, что делает их более масштабируемыми.

Исходя из ваших правок, обмен сообщениями может быть лучшим решением, поскольку он по своей сути асинхронный.

1 голос
/ 03 октября 2011

Один из подходов, который мы успешно использовали, - это Named Pipes. В .net 3.5 они добавили встроенную поддержку, поэтому вам не нужно использовать p / invoke для доступа к соответствующим win32 API.

Выезд: http://www.switchonthecode.com/tutorials/dotnet-35-adds-named-pipes-support в качестве примера.

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

Приятно то, что вы можете легко отправлять целые структуры данных (при условии, что они помечены как [Сериализуемые]). Это позволяет вам широко реализовывать определенные сообщения (в том числе и Enums)

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

[Serializable]
public enum CmdType
{
    cmdTypeOne,
    someOtherCmdType
}

[Serializable]
public class Command
{
  CmdType eCmdType;
  // other command payload
}
0 голосов
/ 03 октября 2011

Файлы с отображением в памяти работают быстро. Хотя API-интерфейсы очень разные, поэтому вам нужно написать оболочку с P / Invokes, чтобы использовать ее независимо от платформы. Наш продукт MsgConnect имеет транспорт MMF, который решит вашу проблему, если для вас подойдет использование сторонних решений. Конечно, для своей довольно узкой задачи вы можете создать нечто подобное самостоятельно.

0 голосов
/ 03 октября 2011

Именованные каналы могут быть возможным решением.В CodeProject есть очень подробная статья с примером.Статьи начинаются с:

Вам когда-нибудь приходилось обмениваться данными между двумя приложениями .NET, работающими на одной машине?Например, веб-сайт разговаривает со службой Windows?.NET Framework предоставляет несколько хороших вариантов межпроцессного взаимодействия (IPC), таких как веб-службы и удаленное взаимодействие, наиболее быстрым из которых является удаленное взаимодействие с каналом TCP и двоичным форматером.1009 *

...