Межпроцессное взаимодействие для Windows в C# (.NET 2.0)
Мне никогда не приходилось делать IPC на Windows раньше. В настоящее время я разрабатываю пару программ, стандартное приложение GUI/CLI и службу windows. Приложение должно сказать службе, что делать. Итак, предполагая, что связь только локальная, какой был бы лучший способ связи для этих двух процессов?
где best определяется как более надежный и менее подверженный ошибкам, а не самый эффективный и не самый простой в коде.
примеры кода будут очень рады, но не требуется : -)
примечание Я спрашиваю о том, что использовать, стандартный сокет TCP, именованные каналы или некоторые другие средства связи только.
спасибо!
6 ответов:
IPC в .Net может быть достигнуто с помощью:
WCF
использование именованных каналов требуется .Net 3.0 и выше.
пример кода
- класс WCF 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
- Инго Досылатель, написал окончательный .Остаточная удаленного доступа, Advanced .NET Remoting, второе издание
Win32 RPC с помощью csharptest-net RpcLibrary
недавно я наткнулся на проект, который имеет обернул библиотеку Win32 RPC и создал библиотеку классов .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 с общей памятью в качестве базового механизма связи между доменами приложений на одном компьютере. Используя этот подход, вы можете легко разместить свои процессы на разных машинах и заменить протокол общей памяти сетевым протоколом.
стандартный способ связи со службой windows заключается в использовании кодов управления службой. Службы Windows могут получать коды от 0 до 255. 0-127 зарезервировано для системы. 128 до 255 можно использовать для пользовательских команд.
Если вам нужно отправить сложные объекты в службу, используйте базу данных, xml, файл, tcp, http и т. д. Кроме того, для отправки команд управления, таких как конфигурация перезагрузки, элементы процесса и т. д., следует использовать эти управляющие коды.
дополнительные доступные функции, такие как запрос службы. См. раздел служебная документация Windows и api.
лучше всего использовать WCF. Вы сможете создать узел службы в службе windows и предоставить четко определенный интерфейс, который может использовать приложение GUI. WCF позволит вам общаться через именованные каналы, если вы выберете, или вы можете выбрать любой другой протокол связи, такой как TCP, HTTP и т. д. Используя WCF вы получаете отличную поддержку инструментов и много доступной информации.
Я хотел бы добавить к этой дискуссии. Пожалуйста, упрекните меня, если это выход - но не может ли семафор (или несколько семафоров) использоваться для рудиментарной коммуникации?
Comments