2010-01-14 2 views
7

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

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

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

+0

Вы серьезно думаете, что можете написать код IPC для программы на C++ без опыта работы на C++? – 2010-01-14 12:58:26

+3

Да. Я уже написал блокирующую версию с использованием труб. Но ни один из методов, которые вызовут игры, не может блокироваться - и я думаю, что асинхронный ipc немного подтолкнул бы его. Честно говоря, я надеялся на какой-то фреймворк или библиотеку, которая уже написана, что я могу использовать, так как я хочу только сделать очень простой IPC – Martin

ответ

6

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

+0

О, это выглядит многообещающе! – Martin

3

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

6

Есть lots of different ways of doing IPC in Windows. Для C# на C++ у меня возникнет соблазн использовать Sockets как API под обоими C++ (WinSock в порядке, когда вы обходите вокруг), а C# довольно просто.

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

+1

IPC на том же компьютере, безусловно, имеет дело с именованными каналами, -оптимальный. –

+0

У меня есть базовая версия, работающая с использованием именованных каналов уже, но она блокирует, что приводит к сбою игры. Я чувствую, что асинхронный IO будет слишком сильно подталкивать мои возможности C++:/ – Martin

+0

Async IO не должен быть _too_ hard, я уверен, что вы можете использовать каналы без блокировки. Если нет, будьте готовы к долгую ночь! @Aviad: Да, сокеты, вероятно, не так хороши, но я хотел предложить ответ, который слегка контрастировал с Аггело :) – mdm

Смежные вопросы