Какие технологии можно использовать для вызова из нативного процесса в процесс C #? - PullRequest
2 голосов
/ 29 октября 2010

У меня есть собственный (C ++) процесс и управляемый (C #) процесс в одной системе.Я хочу включить связь между ними, подобно тому, как можно использовать RPC между двумя нативными процессами.Я знаю, что мог бы использовать WCF, используя WWSAPI от Microsoft в нативном процессе. Но мне было интересно, какие еще есть варианты?Или WCF лучшее / единственное решение?

Ответы [ 4 ]

4 голосов
/ 29 октября 2010

Если вы хотите обмениваться данными между двумя процессами, у вас есть широкий выбор опций, как повторил повтор в своем ответе. К его списку вы можете добавить разделяемую память (файлы с отображенной памятью) и именованные объекты синхронизации, такие как семафоры и события. Я уверен, что есть другие.

Если вы хотите, чтобы приложение C ++ вызывало функции в приложении C #, ваши параметры более ограничены. WCF - не единственное решение, и, возможно, даже не предпочтительное решение. Вы можете выставить C # как интерфейс COM. Вот один из способов сделать это. http://support.microsoft.com/kb/828736

2 голосов
/ 29 октября 2010

Взгляните на Apache Thrift :

Thrift - это программная структура для разработки масштабируемых межъязыковых сервисов.Он объединяет программный стек с механизмом генерации кода для создания сервисов, которые эффективно и без проблем работают между C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Cocoa, Smalltalk и OCaml.

Первоначально разработанный в Facebook, Thrift был открыт в апреле 2007 года и вошел в Apache Incubator в мае 2008 года.

1 голос
/ 29 октября 2010

Если программа на C ++ "отвечает", то COM Interop, как упомянуто @Jim, вероятно, является вашим единственным выбором. Если это скорее двусторонняя вещь, вы также можете выполнить «reverse PInvoke» (не официальное имя), где код C # превращает делегат в указатель функции, а PInvokes (плоский стиль C) функция в коде C ++, передав в указателе функции, а затем код C ++ использует указатель функции для запуска любого метода C #, который находится в конце делегата. Хотя это требует немного больше сантехники, это избавит вас от совершенства COM Interop. Или, если вы чувствуете себя действительно смелым, вы можете написать управляемый класс C ++ / CLI, который будет вызывать ваш код C # обычным способом, и с помощью шаблона gcroot <> вызывать его из вашего собственного кода C ++.

http://www.gregcons.com/KateBlog/CallingManagedCodeFromNativeCode.aspx содержит ссылку на запись в блоге для этого третьего способа. http://www.gregcons.com/KateBlog/IntroToCOMInterop.aspx,, которому почти 4 года, имеет ссылку на статью MSDN, в которой немного расширяются первые два варианта.

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

1 голос
/ 29 октября 2010

Просто назвать несколько.на основе файлов, TCP / IP, каналы, именованные каналы, почтовые рассылки, MQ, сообщения Windows,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...