Если программа на 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: веб-сервисы как способ связи между двумя программами на одной машине, написанными одним и тем же разработчиком, почти никогда не являются правильным ответом. Не то чтобы это не сработало, но есть более быстрые и простые способы, если вы контролируете оба конца.