Межпроцессное взаимодействие C + C #: именованные каналы, файлы с отображением в памяти или другое? - PullRequest
4 голосов
/ 06 января 2010

Я играю с C dll для перехвата глобальных событий Windows, и следующий шаг - отправка некоторых данных о событиях (ничего больших) в приложение C #.

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

Я знаю, что .NET 4 приносит MMF естественным образом, но я должен ориентироваться на .NET 2, так как существование клиентов Win98 все еще возможно. Я также знаю, что есть способы управления MMF с помощью .NET 2 через Windows API (и некоторые люди даже создали некоторые оболочки).

В этом контексте я хотел бы знать:

  1. Есть ли какие-либо большие недостатки (в основном производительность) при выборе Named Pipes вместо MMF? Важно помнить, что я не буду передавать огромное количество данных;
  2. Есть ли какие-либо проблемы безопасности, связанные с NP или MMF (для .NET 2)?
  3. Есть ли лучший выбор, чем те?

Ответы [ 3 ]

2 голосов
/ 17 января 2010

Если у целевого приложения есть окно, в которое вы можете отправлять сообщения, и объем отправляемых данных относительно невелик, рассмотрите возможность использования сообщения WM_COPYDATA для передачи информации.

Это сообщение было разработано для простого межпроцессного взаимодействия (где цель имеет графический интерфейс пользователя), может использоваться нативным приложением или приложением .NET практически без усилий, и не окажет никакого влияния на систему, кроме давления поместите в память, создав данные, которые вы передаете, и доступны во всех системах Windows из Windows 95.

http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx

1 голос
/ 06 января 2010

Вариант 1. Предоставьте интерфейс COM одному из ваших объектов C # и вызовите его из своего приложения C ++.

Вариант 2. Использование C ++ / CLI - вы можете использовать Win32 API для перехвата глобальных событий Windows и предоставления класса .Net с другой стороны для непосредственного использования клиентами C #.

Конечно, ни один из этих вариантов не отвечает на ваш вопрос о именованных каналах или файлах с отображением в памяти, но я думаю, что любой из них будет проще, если у вас нет особой необходимости хранить их как отдельные процессы.

0 голосов
/ 28 января 2010

Не могу рассказать о MMF, так как я не пытался его использовать, но, судя по всему, он слишком сложен для настройки. После переноса P / вызывает возможность представлять Named Pipes в виде потока с .NET 2.0 (я создал двойников классов 3.5 System.Core), довольно просто отправлять пакеты данных в любом случае ЕСЛИ вы можете установить права доступа, чтобы в Vista / 7 работали более строгие политики.

Вероятно, вам лучше иметь поток Server в приложении C # и иметь множество возможных экземпляров клиентов в нативном коде, которые подскакивают (я не уверен, что вы сможете поделиться одним экземпляром, запущенным до подключения со всеми процессами, которые вы внедряете в dll, так что я думаю, что у вас будет несколько клиентов).

Я вообще отказался от перехвата DLL для Vista / 7.

...