Передача данных между приложением C ++ (MFC) и C#
Вопрос
У нас есть монолитное приложение с графическим интерфейсом MFC, срок службы которого на C ++ подходит к концу.Мы планируем создать новую функциональность на C # и передавать данные между каждым приложением.
Вопрос в том,:Каков наилучший подход для передачи данных между C ++ и C #?
Примечания:
Оба конца будут иметь интерфейс GUI, и, вероятно, им потребуется передавать только простые данные, такие как Id, и, возможно, иметь механизм, который указывает другому приложению, какой процесс / функциональность использовать.
Например, одним из приложений будет CRM-система на C #, которая при двойном щелчке по строке в таблице будет передавать, скажем, идентификатор клиента и сообщение для открытия этого клиента в форме клиента приложения MFC.
Я провел небольшое исследование, варианты, похоже, Windows Messaging, Отображение памяти, Именованные каналы или что-то вроде Windows Sockets.На данном этапе мы склоняемся к именованным каналам, но были бы действительно признательны за другие советы или наработки других людей.
Решение
Лично я бы подумал об использовании чего-то вроде именованных каналов, поскольку они просты в использовании со стороны C ++ и System.IO.Pipes на стороне .NET также.
Это также был бы путь, вероятно, наименьшего сопротивления, если вы планируете заменить другие не.ЧИСТЫЕ биты приложения с течением времени.
Другие советы
Делай свой выбор:
- Файлы
- именованные трубы <-- Моя рекомендация
- общая память
- розетки
- КОМ
- Сообщения Windows
Почему названные каналы?
- Предоставляет вам бесплатный способ работы в формате FIFO (как сокеты, но не как разделяемая память).
- Может легко общаться обоими способами
- Хорошо поддерживается на всех платформах
- Простота в использовании
- Надежная передача и доставка данных
- Может быть блокирующим и неблокирующим
- Может считывать данные без удаления (в отличие от сокетов)
- Может быть легко расширен для включения третьего приложения.
В .Net просто используйте System.IO.Pipes.
В C ++ используйте CreateNamedPipe и CreateFile.
Вы также можете использовать P / Invoke с управляемой стороны - это было бы полезно, если приложение MFC имеет C API.Также вы можете использовать COM с любой стороны.
Перечисленные вами параметры, безусловно, допустимы, но вы также могли бы рассмотреть COM.
Я бы использовал сокеты (TCP) - и MFC, и .NET имеют для них прямую поддержку.
Вам действительно нужны два процесса?
Неуправляемый C ++ и управляемый C # код вполне способны работать в одном процессе, и с небольшим уровнем управляемого C ++ / CLI вы могли бы заменить сложность межпроцессного взаимодействия простыми вызовами функций.
Моими вариантами были бы либо стандартные оконные сообщения (напримерWM_FOO) или DCOM:
Сообщения будут работать до тех пор, пока связь очень проста, а накладные расходы на ее настройку минимальны.Если вы можете свести общение к одному или двум целым числам на сообщение, это, вероятно, было бы хорошим началом.Если оба приложения уже являются оконными приложениями, в них обоих уже есть циклы обмена сообщениями, так что вы уже проделали большую часть пути.
DCOM требует гораздо больших затрат времени программиста, но это приятно тем, что вы можете определить более богатый интерфейс и избежать необходимости преобразовывать сложные сообщения в / из двоичной формы.Если вы пойдете по этому пути, CoRegisterClassObject будет отправной точкой для публикации объекта через DCOM.Я никогда не пробовал делать это из приложения на C #, но в принципе это должно быть вполне возможно
Предполагая, что у вас есть исходный код устаревшего приложения, посмотрите, не можете ли вы скомпилировать весь код "рабочей лошадки" в виде DLL, а затем вызвать отдельные функции / окна оттуда.Как только у вас это заработает, вы можете просто написать управляемые оболочки C ++ вокруг нужных вам функций и вызывать их из вашего кода C #.Весь процесс может занять меньше дня, если вам повезет.
Я бы сказал C ++ / CLI, если вам не нужно беспокоиться о .NET framework, существующий во всех системах, на которых будет запущено приложение, и COM в противном случае.Однако на самом деле это будет зависеть от того, с чем вам наиболее комфортно и знакомо.Мне нравится существующая структура 'вызова функции' C ++ / CLI и COM (в отличие от построения ее с помощью других протоколов), но это только у меня.
В настоящее время я использую COM для добавления некоторых функций .Функциональность сетевого компонента, в основном из-за необходимости по-прежнему работать с резервными вариантами, если .NET отсутствует, но это зависит от моих потребностей, где предпочтительнее максимальное развертывание.