我有一个Win32 C ++游戏端项目,我想创建一个可以动态连接的C#进程。然后,C ++进程可以将调试数据发送到C#进程,C#控制台可以将调试命令发送到C ++进程。我知道这可以做到,但我不知道该怎么做。有人知道吗?
答案 0 :(得分:5)
有很多方法可以沟通跨进程。出于您的目的,我建议您使用套接字在两者之间进行通信,因为如果您愿意,这也允许您在机器之间进行通信;并且使用套接字的语义在两种语言中都是相似的。
在C#Side,您可以使用System.Net.Sockets中的Socket
或TcpClient
类开始使用套接字。此外,您可能会发现在C#进程中实现服务器/侦听端更容易一些。
TcpClient Class @ MSDN
Socket Class @ MSDN
System.Net.Sockets Namespace @ MSDN
在C ++方面,您有两种利用套接字的方法,可以通过WinSock函数或Unix / POSIX样式函数。
Getting Started with Winsock @ MSDN
请注意,WSA****
函数是正式的WinSock函数,select
/ listen
/ bind
/ ...
是传统的Unix / POSIX函数。你可以使用一套或另一套。
TCP套接字可能是您最好的选择;但您可能会发现UDP可以让您更快地开始使用。此外,您可能会使用UDP多播做有趣的事情。如果使用套接字,请不要忘记检查防火墙设置。
两者之间的其他可能的沟通方式涉及您可能需要学习的不同数量的工作和领域知识。以下是优点和缺点的简要概述。
命名管道
优点:在同一台机器上表现出色,在C ++中易于控制 缺点:跨机器边界难以使用。
COM应用程序服务器
优点:易于在C#端消费。一旦创建,很容易在C ++方面扩展 缺点:可能难以调试,并且添加对现有项目的支持很棘手。也容易出现COM注册和调试问题。难以学习跨机器和用户会话边界使用。
共享内存
优点:性能卓越,C ++易于控制,C#中易于控制 缺点:不能跨机器使用。虽然您总是可以为每一方创建一个缓冲区,并为缓冲区进行单向通信,但是在跨进程共享缓冲区方面存在问题。如果您的应用程序之间的通信次数超过1:1,则使用起来很棘手。
答案 1 :(得分:0)
我正在使用其中一个项目中的命名管道做类似的事情。虽然我没有在实施方面工作,但它似乎很好地完成了这项工作。以下链接提供了一个很好的概述。
http://msdn.microsoft.com/en-us/library/aa365590(v=vs.85).aspx