C#和C++之间的进程间通信用于游戏调试引擎。

5
我正在为游戏脚本引擎开发一个调试器项目。我希望用C#编写调试器的GUI。然而,实际的调试引擎嵌入在游戏中,并且是由C、C++和汇编补丁混合编写的。
在调试器GUI和调试引擎之间处理通信的最佳方法是什么?两个进程将在不同的进程中运行。
谢谢!
安迪
2个回答

4

如果您的系统能够支持Windows Vista或更高版本,并且安装了.Net 3.5或更高版本,那么命名管道可以提供简单、高效的进程间通信。您可以查看这篇文章了解更多细节。


1
命名管道在XP中工作,在.NET 2中也可以通过PInvoke使用,因此它们始终是一个不错的选择。 - Reed Copsey
2
而且,在 Unix 上也是如此,因为没有人提起它。 - Jon Purdy
你不能再进一步吗?在C#实现中,你可以使用命名管道来实现WCF。 - Jaxidian
命名管道就是它了。谢谢,伙计们。 - Andy
1
@Jaxidian:这个想法不好,因为你需要在C++端复制整个WCF实现。 - Ben Voigt

2

我在几年前做过这个。脚本调试器是用C#编写的,运行在PC上;脚本运行时是用C++编写的,并且在我们当时支持的所有设备上运行——PC、PS3、Xbox360、Wii、DS、PSP和PS2。

无论你的目标是什么,我建议你加入某种层,使调试器和运行时与底层协议隔离开来。尽可能保持API调用可见!这样可以留下你的选择,并(如果做得好)简化两端的代码。一种基于数据包的系统,每个数据包1K或更少,可以映射到几乎任何东西。(传输大于1K的内容可以在更高的级别上完成,只使用公共API。)

如果你只针对PC,我建议使用TCP/IP。它是网络透明的,每个人都熟悉它的IP地址和端口,使用API方面不比命名管道更难。

对于下一代游戏,如果你想在跨平台兼容性和编码易用性之间取得良好的平衡,TCP/IP仍然是最佳选择。它适用于PC、Xbox360和PS3。

(关于命名管道,SN的Target Manager将为您提供PS3和PS2的命名管道支持,我记得它通过开发LAN端口而不是游戏LAN端口进行传输,但Xbox360根本不支持它。因此,如果值得支持它-如果我记得正确的话!-但它不是万能的灵丹妙药。

个人而言,在实现TCP/IP支持后,我就停了下来,我很高兴我这样做了!简而言之,Wii和DS都很糟糕,但方式不同,并且与其他任何东西都不同。PSP只支持命名管道,原因不明。PS3和PS2支持TCP/IP,但仅通过游戏LAN端口。(开发LAN端口的工作方式不同。不要使用它。向您的制片人索取更多的网络电缆,节省您的理智。)Xbox360支持TCP/IP,但仅在使用调试库并仅通过游戏IP时才支持。(调试IP的工作方式不同。不要使用它。)

简而言之-无论你做什么,你都需要那个隔离层。


幸运的是,我针对两个应用都是PC。我想我会选择使用命名管道,并像你建议的那样实现绝缘层。现在—— 实现这样的绝缘层最好的方法是什么?我不想分别用C++和C#编写两个版本。有没有一种简单的方法可以在C#中使用C++代码而无需从dll中加载它? - Andy
你无法避免使用DLL,但你可以编写C++代码,并在游戏中直接使用。然后编写Managed C++的shim程序,并将其(以及C++代码)编译为Managed C++项目,以供调试器解决方案使用。这应该相当容易,并且能够很透明地工作。(就我而言,我只是两次编写了代码,一次是C++,一次是C#,并不算太难。如果可能,我不喜欢在游戏和工具之间共享代码,因为代码最终会同时被拉向两个不同的方向。) - please delete me

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接