2008-09-04 5 views
0

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

Первоначально я реализовал решение, основанное на this article. Однако для этого требуется, чтобы сервер, который выполнял сервер, выполнялся перед клиентом.

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

ответ

1

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

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

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

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

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

0

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

0

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

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

0

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

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

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

-Скотт

0

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

HTH, Circ