Межпроцессное взаимодействие для Windows в C# (.NET 2.0)
Мне никогда не приходилось делать IPC на Windows раньше. В настоящее время я разрабатываю пару программ, стандартное приложение GUI/CLI и службу Windows. Приложение должно сообщить службе, что делать. Итак, предполагая, что общение является только локальным, каков будет лучший способ связи для этих двух процессов?
Где лучшее определяется как более устойчивое и менее подверженное ошибкам, не самое производительное и не простое в коде.
Примеры кода будут очень кстати, но не обязательны:-)
Заметьте, я спрашиваю о том, что использовать, стандартный сокет TCP, именованные каналы или только о некоторых других средствах связи.
Спасибо!
6 ответов
IPC в.Net может быть достигнут с помощью:
WCF
использование именованных каналов требует.Net 3.0 и выше.
Пример кода
- Класс WCN NetNamedPipeBinding можно использовать для межпроцессного взаимодействия на одном компьютере. Документация MSDN для этого класса включает пример кода, охватывающий этот сценарий http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx
Remoting
Оригинальная платформа IPC, выпущенная с.Net 1.0. Я считаю, что удаленное взаимодействие больше не активно развивается, и вместо этого вам рекомендуется использовать WCF.
Пример кода
Межпроцессное взаимодействие через Remoting - использует канал TCP
Ресурсы
- GenuineChannels, продайте набор инструментов удаленного взаимодействия, который включает в себя канал общей памяти. http://www.genuinechannels.com/Index.aspx
- Инго Раммер (Ingo Rammer) написал исчерпывающую книгу.Net Remoting, Advanced.NET Remoting, второе издание
Win32 RPC с использованием csharptest-net RpcLibrary
Недавно я наткнулся на проект, который обернул библиотеку RPC Win32 и создал библиотеку классов.net, которую можно использовать для локального и удаленного RPC.
Домашняя страница проекта: http://csharptest.net/projects/rpclibrary/
Ссылки MSDN:
- Как работает rpc: http://technet.microsoft.com/en-us/library/cc738291(v=ws.10).aspx
- Функции RPC: http://msdn.microsoft.com/en-us/library/aa378623(v=VS.85).aspx
Также есть клиент 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 remoting с общей памятью в качестве основного механизма связи между доменами приложений на одном компьютере. Используя этот подход, вы можете легко разместить свои процессы на разных машинах и заменить протокол общей памяти сетевым протоколом.
Стандартный метод связи со службой Windows - это использование кодов управления службой. Службы Windows могут получать коды от 0 до 255. 0-127 зарезервировано для системы. От 128 до 255 можно использовать для пользовательских команд.
Если вам нужно отправить сложные объекты в службу, используйте базу данных, xml, файл, tcp, http и т. Д. Кроме того, для отправки команд управления, таких как перезагрузка конфигурации, элементы процесса и т. Д., Следует использовать эти коды управления.
Доступны дополнительные функции, такие как запрос к услуге. Смотрите документацию по сервису Windows и API.
Лучше всего использовать WCF. Вы сможете создать хост службы в службе Windows и предоставить четко определенный интерфейс, который может использовать приложение с графическим интерфейсом. WCF позволит вам общаться по именованным каналам, если вы захотите, или вы можете выбрать любой другой протокол взаимодействия, такой как TCP, HTTP и т. Д. Используя WCF, вы получаете отличную поддержку инструментов и множество доступной информации.
Я хотел бы добавить к этому обсуждению. Пожалуйста, упрекните меня, если это выход из положения, но нельзя ли использовать семафор (или несколько семафоров) для элементарного общения?