C#和C++之间的进程间通信

Mar*_*tin 7 .net c# c++ ipc

我正在为游戏编写一个机器人,它有一个C++ API接口(即当事件发生时,游戏调用Cpp dll中的方法,dll可以回调游戏中的方法来触发动作).

我真的不想用C++编写机器人,我是一个相当有经验的C#程序员,但我根本没有C++经验.因此,显而易见的解决方案是使用ipc将事件发送到C#程序,并将操作发送回C++程序,这样我在C++中编写的所有内容都是调用方法和发送事件的基本框架.

最好的方法是什么?示例代码将非常受欢迎,因为我此刻并不特别渴望学习C++!

mdm*_*mdm 7

在Windows中很多不同的IPC方式.对于C#到C++,我很想在两个C++下使用套接字作为API(一旦你了解它就可以使用WinSock),而C#非常简单.

如果您不想使用套接字,并且专门为IPC设计,则命名管道可能会更好.C++下的API看起来很简单,例如这里.


Avi*_* P. 6

一种解决方案是使用常规__declspec(dllexport)函数创建托管C++类库,该函数在引用的C#类库中调用托管方法.

示例 - 托管C++项目中的C++代码文件:

#include "stdafx.h"

__declspec(dllexport) int Foo(int bar) 
{
    csharpmodule::CSharpModule mod;
    return mod.Foo(bar);
}
Run Code Online (Sandbox Code Playgroud)

C#模块(解决方案中的单独项目):

namespace csharpmodule
{
    public class CSharpModule
    {
        public int Foo(int bar)
        {
            MessageBox.Show("Foo(" + bar + ")");
            return bar;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我通过使用调用来演示这是一个实际的.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;
}
Run Code Online (Sandbox Code Playgroud)

请记住将Win32控制台应用程序与.lib托管C++项目的构建所产生的文件相链接.