Передача данных между приложением C ++ (MFC) и C#

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

  •  06-07-2019
  •  | 
  •  

Вопрос

У нас есть монолитное приложение с графическим интерфейсом 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 отсутствует, но это зависит от моих потребностей, где предпочтительнее максимальное развертывание.

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