Межпроцессное взаимодействие между C# и C++

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

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

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

7
задан Martin 16 October 2012 в 14:51
поделиться

3 ответа

Одним из решений состоит в том, чтобы создать управляемую библиотеку класса 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 Вызов.

Применение консоли Basic (Non-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 ++.

6
ответ дан 6 December 2019 в 12:51
поделиться

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

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

7
ответ дан 6 December 2019 в 12:51
поделиться

К сожалению, как я упомянул в другом вопросе: Почему неявный вывод типа работает только в назначении? , неявный вывод типа в Java работает только в назначении.

Я до сих пор не знаю причину. Но для меня это все еще кажется глупым.

-121--4859812-

Это происходит из-за стирания типа.

Из руководства Java Generic

При создании экземпляра универсального типа компилятор переводит эти типы по техника, называемая стиранием типа - a процесс, в котором компилятор удаляет все информация, относящаяся к параметрам типа и аргументы типа в пределах класса или способ.

Поскольку вызов Lady.ListAll выполняется для необработанного типа Minatchi, компилятор не может знать, что конкретный тип является Minatchi

Стирание типа было использовано для дженериков, чтобы универсальные типы были совместимы с библиотеками Java, скомпилированными до добавления дженериков в библиотеку. Была предпринята попытка добавить в Java повторение , но оно не включено в план выпуска Java 7.

-121--4859813-

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

3
ответ дан 6 December 2019 в 12:51
поделиться