Межпроцессное взаимодействие для Windows в C # (.NET 2.0) - PullRequest
51 голосов
/ 08 сентября 2008

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

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

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

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

Спасибо!

Ответы [ 6 ]

71 голосов
/ 08 сентября 2008

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

WCF

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

Пример кода


Remoting

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

Пример кода

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

Ресурсы


Win32 RPC с использованием csharptest-net RpcLibrary

Недавно я наткнулся на проект, который обернул библиотеку RPC Win32 и создал библиотеку классов .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.

Ресурсы

Гнезда

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

6 голосов
/ 08 сентября 2008

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

2 голосов
/ 09 сентября 2010

Стандартный метод связи со службой 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/

2 голосов
/ 08 сентября 2008

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

0 голосов
/ 11 февраля 2011

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

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

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

...