.NET IPC без посредника службы - PullRequest
0 голосов
/ 04 сентября 2008

У меня есть два несвязанных процесса, которые используют сборки .NET в качестве плагинов. Однако любой процесс может быть запущен / остановлен в любое время. Я не могу полагаться на конкретный процесс, являющийся сервером. На самом деле может быть несколько копий одного из процессов, но только один из них.

Я изначально реализовал решение, основанное на этой статье . Однако для этого требуется, чтобы сервер, выполняющий сервер, работал до клиента.

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

Ответы [ 5 ]

1 голос
/ 03 ноября 2008

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

Если вы идете по маршруту удаленного взаимодействия, вы можете использовать IpcChannel вместо каналов TCP или HTTP для единой системы связи с использованием именованных каналов. http://msdn.microsoft.com/en-us/library/4b3scst2.aspx. Проблема этого решения заключается в том, что вам нужно будет найти решение с типом реестра (в общей памяти или в другом постоянном хранилище), с помощью которого процессы могут зарегистрировать свои конечные точки. Таким образом, когда вы ищете их, вы можете найти способ запросить все конечные точки, которые работают в системе, и вы можете найти то, что вы ищете. Преимущества использования Remoting в том, что сериализация и вызов методов довольно просты. Кроме того, если вы решите перейти на несколько компьютеров в сети, вы можете просто переключить коммутатор, чтобы использовать вместо этого сетевые каналы. Недостатки в том, что удаленное взаимодействие может разочаровать, если вы четко не отделите «удаленные» вызовы от «локальных».

Я мало что знаю о WCF, но это также может стоить изучить. Чувство паука говорит, что у него, вероятно, есть более элегантное решение этой проблемы ... возможно.

Кроме того, вы можете создать «серверный» процесс, который будет отделен от всех других процессов и будет запущен (используйте систему Mutex, чтобы убедиться, что более одного не запущено), чтобы выполнять роль посредника и регистрации. концентратор для всех других процессов.

Еще одна вещь, которую нужно рассмотреть в модели публикации-подписки на события (Pub / Sub). Этот метод помогает, когда у вас есть прослушиватель, который запускается до того, как источник события станет доступен, но вы не хотите ждать, чтобы зарегистрироваться для события. Процесс «сервер» будет обрабатывать реестр событий, чтобы связать издателей и подписчиков.

0 голосов
/ 08 июля 2009

Я потратил 2 дня, изучая все варианты, доступные для IPC, и в то же время искал надежный, простой и быстрый способ сделать дуплексный IPC. IPCLibrary , который я нашел на Codeplex.com, до сих пор прекрасно работает из всех опций, которые я пробовал. Все только с 7 строками кода. : D Если кто-нибудь наткнется на эту попытку найти полнодуплексный IPC, сэкономьте массу времени и попробуйте эту библиотеку. Получите исходный код, скомпилируйте data.dll и следуйте приведенным примерам.

НТН, ЦО

0 голосов
/ 04 ноября 2008

Я согласен с Гаро.

Использование сервиса pub / sub было бы отличным решением. Это, очевидно, означает, что эта служба должна быть запущена и запущена раньше, чем любой из двух других.

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

-Скотт

0 голосов
/ 21 октября 2008

Есть много способов обработки IPC (.net или нет), и через туннель TCP / HTTP это один из способов ... но может быть очень плохим выбором (в зависимости от обстоятельств и условий).

Совместное использование памяти и именованных каналов - это два способа (и да, они могут быть выполнены в .Net), которые могут стать для вас лучшим решением. В .Net Framework также есть класс IPC ... но мне лично они не нравятся из-за некоторых проблем с доменом приложения ...

0 голосов
/ 04 сентября 2008

Почему бы не разместить сервер и клиента с обеих сторон, а тот, кто придет первым, станет сервером? А если сервер отключается, клиент, который все еще активен, меняет роли.

...