tags:

views:

268

answers:

3

I'm writing a bit for a game, which has a C++ API interface (ie. methods in a Cpp dll get called by the game when events occur, the dll can call back methods in the game to trigger actions).

I don't really want to write my bot in C++, I'm a fairly experience C# programmer but I have no C++ experience at all. So, the obvious solution is to use ipc to send event to a C# program, and send actions back to the C++ one, that way all I need to write in C++ is a basic framework for calling methods and sending events.

What would be the best way to do this? Sample code would be greatly appreciated as I have particular desire to learn Cpp at this point!

+3  A: 

In such occasion, I would like to see a C++/CLI party and a C# one using the .NET Framework's named pipes.

Aggelos Mpimpoudis
+3  A: 

There are lots of different ways of doing IPC in Windows. For C# to C++, I'd be tempted to use Sockets as the API under both C++ (WinSock is OK once you get your head around it) and C# is pretty easy.

Named Pipes might be better though if you don't want to use sockets, and were designed specifically for IPC. The API under C++ seems pretty simple, example here.

mdm
IPC on same machine is definitely a case for named pipes, sockets are sub-optimal.
Aviad P.
I have a basic version working using named pipes already, but it blocks, which causes the game to crash. I get the feeling asynchronous IO would be pushing my C++ capabilities a bit too much :/
Martin
Async IO shouldn't be _too_ hard, I'm pretty sure you can use pipes without blocking. If not, be prepared for a long night!@Aviad: Yes sockets probably aren't as good but I wanted to offer an answer that contrasted Aggelo's slightly :)
mdm
Well there is a method "PeekNamedPipe" which tells you how much data is in the pipe, but that seems to block too :/I can't see any other way to do it, except with asynch. I guess I'll have to do that :/
Martin
http://www.codeproject.com/KB/dotnet/NamedPipeOverlapped.aspx - found that after a quick Google, it's in C# but gives you a good idea of how to do simple async IPC with pipes.
mdm
+1  A: 

One solution is to create a managed C++ class library with regular __declspec(dllexport) functions which call managed methods in a referenced C# class library.

Example - C++ code file in managed C++ project:

#include "stdafx.h"

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

C# Module (separate project in solution):

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

Note that I am demonstrating that this is an actual .NET call by using a System.Windows.Forms.MessageBox.Show call.

Sample basic (non-CLR) Win32 console application:

__declspec(dllimport) int Foo(int bar);

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

Remember to link the Win32 console application with the .lib file resulting from the build of the managed C++ project.

Aviad P.
Ooh, that looks promising!
Martin