Межпроцессное взаимодействие для Windows в C# (.NET 2.0)


Мне никогда не приходилось делать IPC на Windows раньше. В настоящее время я разрабатываю пару программ, стандартное приложение GUI/CLI и службу windows. Приложение должно сказать службе, что делать. Итак, предполагая, что связь только локальная, какой был бы лучший способ связи для этих двух процессов?

где best определяется как более надежный и менее подверженный ошибкам, а не самый эффективный и не самый простой в коде.

примеры кода будут очень рады, но не требуется : -)

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

спасибо!

6   51   2008-09-08 21:00:00

6 ответов:

IPC в .Net может быть достигнуто с помощью:

WCF

использование именованных каналов требуется .Net 3.0 и выше.

пример кода


Remoting

исходная платформа IPC, выпущенная с .Net 1.0. Я считаю, что удаленное взаимодействие больше не активно развивается, и вам рекомендуется использовать WCF вместо

пример кода

межпроцессное взаимодействие через Remoting - использует tcp канал

ресурсы


Win32 RPC с помощью csharptest-net RpcLibrary

недавно я наткнулся на проект, который имеет обернул библиотеку Win32 RPC и создал библиотеку классов .net, которая может использоваться для локального и удаленного RPC

Домашняя страница проекта: http://csharptest.net/projects/rpclibrary/

ссылки на MSDN:

также есть клиент RPC буферов протокола google, который работает поверх библиотеки:https://code.google.com/p/protobuf-csharp-rpc/


об ошибке wm_copydata

для полноты также можно использовать метод WIN32 с об ошибке wm_copydata сообщение. Я использовал этот метод раньше в .Net 1.1 для создания одного экземпляра приложения открытие нескольких файлов из Проводника windows.

ресурсы

розетки

использование пользовательского протокола (сложнее)

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

Так как вы ограничены .Net 2.0 WCF, возможно, не вариант. Вы можете использовать удаленное взаимодействие .Net с общей памятью в качестве базового механизма связи между доменами приложений на одном компьютере. Используя этот подход, вы можете легко разместить свои процессы на разных машинах и заменить протокол общей памяти сетевым протоколом.

стандартный способ связи со службой windows заключается в использовании кодов управления службой. Службы Windows могут получать коды от 0 до 255. 0-127 зарезервировано для системы. 128 до 255 можно использовать для пользовательских команд.

Если вам нужно отправить сложные объекты в службу, используйте базу данных, xml, файл, tcp, http и т. д. Кроме того, для отправки команд управления, таких как конфигурация перезагрузки, элементы процесса и т. д., следует использовать эти управляющие коды.

дополнительные доступные функции, такие как запрос службы. См. раздел служебная документация Windows и api.

http://arcanecode.com/2007/05/30/windows-services-in-c-sending-commands-to-your-windows-service-part-7/

лучше всего использовать WCF. Вы сможете создать узел службы в службе windows и предоставить четко определенный интерфейс, который может использовать приложение GUI. WCF позволит вам общаться через именованные каналы, если вы выберете, или вы можете выбрать любой другой протокол связи, такой как TCP, HTTP и т. д. Используя WCF вы получаете отличную поддержку инструментов и много доступной информации.

Я хотел бы добавить к этой дискуссии. Пожалуйста, упрекните меня, если это выход - но не может ли семафор (или несколько семафоров) использоваться для рудиментарной коммуникации?