Как я могу сделать эти технические IPC? - PullRequest
0 голосов
/ 15 декабря 2009

Я помню, как в те дни, когда я использовал C и win32, у меня было несколько методов IPC. До сих пор я не сталкивался ни с одним из них в .NET и не видел их за пределами C, поэтому я подумал, что могу спросить, как мне использовать эти методы межпроцессного взаимодействия?

  1. Общая / Глобальная память. Просто выделите оперативную память, которая может быть изменена другим процессом без какого-либо сигнала.

  2. Оконное сообщение. Я помню, как использовал SendMessage и WM_USER + N, и сказал другому приложению, когда я коснулся общей памяти, попросил его изменить файлы или настройки, а иногда сказал другому приложению, что я набрал некоторые нажатия клавиш, чтобы действовать как макрос, потому что я иногда чувствую себя ленивым.

  3. Динамический обмен данными. Я пытался, но никогда не мог заставить это работать. Из того, что я помню (предупреждение, что это может быть совершенно неправильно), вы регистрируетесь в глобальном сообщении или событии, и другое приложение (обычно ваше) отправляет сообщение, и два или около того приложения могут общаться друг с другом, публиковать сообщения и вы можете иметь интеграцию таким образом между двумя приложениями. Мне очень интересно узнать, что заменило это.

Есть также именованные каналы, которые, как я знаю, до сих пор используются и видны. И я помню людей, рекомендующих сокеты для IPC, но мне никогда не нравилось это делать, и я знаю, что они все еще существуют и могут быть использованы, если мне нужно.

Что еще я пропустил и что заменило эту технику? Я знаю, что есть глобальный мьютекс, это круто. Я все еще ищу современный способ отправки сообщений между двумя приложениями (пункт 2). Я всегда задавался вопросом, была ли какая-то очередь FIFO, которой не было в трубе. Как и сообщение Windows, за исключением того, что я могу отправлять данные (например, 1 КБ) вместо отправки сообщений и распределения глобальной памяти каждый раз.

-edit- bump. эта тема все еще актуальна для меня на данный момент.

Ответы [ 2 ]

3 голосов
/ 15 декабря 2009

В .NET вы можете использовать:

  1. Именованные трубы
  2. Отображенные в память файлы
  3. WCF

Общая / глобальная память не может быть легко достижима в .NET, вам придется взаимодействовать с вызовами Win32 и закреплять управляемую память, чтобы избежать ее перемещения GC.

Сообщения окна, очевидно, работают только тогда, когда у вас есть окна, видимые или скрытые. Этот метод не должен использоваться приложениями .NET.

DDE - не использовать.

1 голос
/ 15 декабря 2009

Даже если вы знаете о сокетах, но вам это не очень нравится, я вспоминаю, что читал где-то, что в Windows сокет через localhost имеет путь быстрого доступа и может быть оптимизирован до уровня одной копии памяти. Тем не менее, на всю жизнь я не могу найти, где я читаю это, так что, возможно, кто-то еще может ссылаться на источник.

Недостатком этого является то, что я полагаю, что для установления соединения вам необходим активный сетевой код, но он фактически не будет использовать весь стек TCP / IP после установления.

Также заметка для поста Андрея, я протестировал Memory Mapped Files (который добавляется только в .net 4.0, если память служит), и у меня были некоторые проблемы с этим. Скорее всего, это сработает, но документации немного, и вам все равно нужно написать, как два приложения синхронизируют чтение и запись, будь то семафор для уведомлений или жесткий цикл, ищущий местоположение в файле ,

Лично в приложении, которое я разрабатываю, я использую сокеты через localhost и до сих пор не сталкивался с какими-либо серьезными проблемами производительности или безопасности. Но это вернется к вашим целям и требованиям безопасности.

...