Межпроцессное взаимодействие между C # и C ++ - PullRequest
7 голосов
/ 14 января 2010

Я пишу бота для игры, которая имеет интерфейс API C ++ (т. Е. Методы в dpp Cpp, вызываемые игрой при возникновении событий, dll могут вызывать методы в игре для запуска действий).

Я не очень хочу писать своего бота на C ++, я довольно опытный программист на C #, но у меня совсем нет опыта работы с C ++. Таким образом, очевидное решение состоит в том, чтобы использовать ipc для отправки события в программу на C # и отправки действий обратно на C ++. Таким образом, все, что мне нужно написать на C ++, - это базовая среда для вызова методов и отправки событий.

Каков наилучший способ сделать это? Пример кода был бы очень признателен, так как у меня нет особого желания изучать C ++ на данный момент!

Ответы [ 3 ]

7 голосов
/ 14 января 2010

В Windows существует множество различных способов выполнения IPC . Для C # на C ++ я бы соблазнился использовать Sockets в качестве API как в C ++ (WinSock в порядке, когда вы разберетесь с этим), так и в C # довольно просто.

Named Pipes может быть лучше, если вы не хотите использовать сокеты, и были разработаны специально для IPC. API под C ++ кажется довольно простым, пример здесь .

6 голосов
/ 14 января 2010

Одним из решений является создание управляемой библиотеки классов C ++ с обычными функциями __declspec(dllexport), которые вызывают управляемые методы в указанной библиотеке классов C #.

Пример - файл кода C ++ в управляемом проекте C ++:

#include "stdafx.h"

__declspec(dllexport) int Foo(int bar) 
{
    csharpmodule::CSharpModule mod;
    return mod.Foo(bar);
}

Модуль C # (отдельный проект в решении):

namespace csharpmodule
{
    public class CSharpModule
    {
        public int Foo(int bar)
        {
            MessageBox.Show("Foo(" + bar + ")");
            return bar;
        }
    }
}

Обратите внимание, что я демонстрирую, что это фактический вызов .NET с использованием вызова System.Windows.Forms.MessageBox.Show.

Пример базового (не CLR) консольного приложения Win32:

__declspec(dllimport) int Foo(int bar);

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << Foo(5) << std::endl;
    return 0;
}

Не забудьте связать консольное приложение Win32 с файлом .lib, полученным в результате сборки управляемого проекта C ++.

3 голосов
/ 14 января 2010

В таком случае я хотел бы видеть сторону C ++ / CLI и сторону C #, использующую именованные каналы .NET Framework.

...