Межпроцессное взаимодействие для Windows на C # (.NET 2.0)
Вопрос
Мне никогда раньше не приходилось выполнять IPC в Windows.В настоящее время я разрабатываю пару программ, стандартное приложение с графическим интерфейсом / CLI и службу Windows.Приложение должно указывать сервису, что делать.Итак, предполагая, что связь является только локальной, каков был бы наилучший метод связи для этих двух процессов?
Где best определяется как более надежный и менее подверженный ошибкам, не самый производительный и не самый простой в кодировании.
Примеры кода будут очень приветствоваться, но не обязательны :-)
Обратите внимание, что я спрашиваю только о том, что использовать: стандартный TCP-сокет, именованные каналы или какие-либо другие средства связи.
Спасибо!
Решение
IPC in .Net может быть достигнут с помощью:
WCF
использование именованных каналов требуется .Net 3.0 и выше.
Пример кода
- Класс WCF Привязка NetNamedPipeBinding может использоваться для межпроцессного взаимодействия на одном компьютере.Документация MSDN для этого класса включает в себя пример кода, охватывающий этот сценарий http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx
Удаленное управление
Оригинальный фреймворк IPC, выпущенный вместе с .Net 1.0.Я полагаю, что удаленное взаимодействие больше не развивается активно, и вам рекомендуется использовать вместо него WCF
Пример кода
Взаимодействие между процессами посредством удаленного взаимодействия - использует tcp -канал
Ресурсы
- GenuineChannels, продает инструментарий удаленного взаимодействия, который включает в себя канал общей памяти. http://www.genuinechannels.com/Index.aspx
- Инго Раммер, написал окончательное .Сетевая книга удаленного взаимодействия, Расширенное удаленное использование .NET, Второе издание
Win32 RPC с использованием csharptest-net rpcclibrary
Недавно я наткнулся на проект, который обернул библиотеку 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 protocol buffers, который работает поверх библиотеки: https://code.google.com/p/protobuf-csharp-rpc/
WM_COPYDATA
Для полноты картины также возможно использовать метод WIN32 с WM_COPYDATA Сообщение.Я уже использовал этот метод ранее в .Net 1.1 для создания приложения с одним экземпляром, открывающего несколько файлов из проводника Windows.
Ресурсы
Розетки
Использование пользовательского протокола (сложнее)
Другие советы
Только для локальных сетей мы успешно использовали Именованные каналы.Позволяет избежать накладных расходов, связанных с TCP, и в значительной степени (по крайней мере, для .NET) настолько эффективен, насколько это возможно, имея при этом достойный API для работы.
Поскольку вы ограничены .Net 2.0, возможно, WCF не подходит.Вы могли бы использовать .Сетевое удаленное взаимодействие с общей памятью в качестве базового механизма связи между доменами приложений на одном компьютере.Используя этот подход, вы можете легко разместить свои процессы на разных компьютерах и заменить протокол общей памяти сетевым протоколом.
Стандартным методом взаимодействия со службой Windows является использование кодов управления службами.Службы Windows могут получать коды от 0 до 255.0-127 зарезервировано для системы.Для пользовательских команд можно использовать значения от 128 до 255.
Если вам нужно отправить сложные объекты в сервис, используйте базу данных, xml, файл, tcp, http и т.д.Кроме этого, для отправки управляющих команд, таких как перезагрузка конфигурации, элементы процесса и т.д., следует использовать эти управляющие коды.
Доступны дополнительные функции, такие как запрос к сервису.Смотрите документацию по службам Windows и api.
Лучше всего использовать WCF.Вы сможете создать узел службы в службе Windows и предоставить четко определенный интерфейс, который может использовать приложение с графическим интерфейсом.WCF позволит вам обмениваться данными по именованным каналам, если вы захотите, или вы можете выбрать любой другой протокол обмена данными, такой как TCP, HTTP и т.д.Используя WCF, вы получаете отличную инструментальную поддержку и множество доступной информации.
Я хотел бы кое-что добавить к этому обсуждению.Пожалуйста, упрекните меня, если это не так - но разве нельзя использовать семафор (или несколько семафоров) для элементарной связи?