我正在为游戏编写一个机器人,它有一个C++ API接口(即当事件发生时,游戏调用Cpp dll中的方法,dll可以回调游戏中的方法来触发动作).
我真的不想用C++编写机器人,我是一个相当有经验的C#程序员,但我根本没有C++经验.因此,显而易见的解决方案是使用ipc将事件发送到C#程序,并将操作发送回C++程序,这样我在C++中编写的所有内容都是调用方法和发送事件的基本框架.
最好的方法是什么?示例代码将非常受欢迎,因为我此刻并不特别渴望学习C++!
在Windows中有很多不同的IPC方式.对于C#到C++,我很想在两个C++下使用套接字作为API(一旦你了解它就可以使用WinSock),而C#非常简单.
如果您不想使用套接字,并且专门为IPC设计,则命名管道可能会更好.C++下的API看起来很简单,例如这里.
一种解决方案是使用常规__declspec(dllexport)
函数创建托管C++类库,该函数在引用的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++项目的构建所产生的文件相链接.