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

StackOverflow https://stackoverflow.com/questions/50153

  •  09-06-2019
  •  | 
  •  

Вопрос

Мне никогда раньше не приходилось выполнять 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 -канал

Ресурсы


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

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

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

Ссылки на MSDN:

Также имеет 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.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top