2011-02-25 71 views
1

我有一个Win32 C++游戏端项目,我想创建一个可以动态连接的C#进程。然后,C++进程可以将调试数据发送到C#进程,并且C#控制台可以将调试命令发送到C++进程。我知道这可以做到,但我不知道该怎么做。有人知道吗?如何使C#控制台实用程序附加到C++ exe?

+5

术语“附加”并不意味着什么。使用标准的进程间通信机制。 .NET和C++都支持命名管道,套接字,内存映射文件,WM_COPYDATA。这样做在过程中总是简单得多。 – 2011-02-25 05:01:25

回答

5

有很多的沟通方式跨进程。为了您的目的,我建议您使用套接字在两者之间进行通信,因为如果您愿意,这也可以让您在机器之间进行通信;并且使用套接字的语义在两种语言中都是相似的。

在C#端,您可以通过在System.Net.Sockets中使用SocketTcpClient类来启动套接字。此外,您可能会发现在C#过程中实现服务器/侦听方面会更容易一些。

TcpClient Class @ MSDN
Socket Class @ MSDN
System.Net.Sockets Namespace @ MSDN

在C++侧,则必须利用套接字的两种手段,或者通过的WinSock功能或Unix/POSIX样式的功能。

Getting Started with Winsock @ MSDN

Winsock Functions @ MSDN

注意,WSA****功能是正式的WinSock功能,并select/listen/bind/...是传统的Unix/POSIX风格的。您可以使用一套或另一套。

TCP套接字可能是你最好的选择;但是你可能会发现UDP可以让你更快上手。另外,你可能会用UDP多播做一些有趣的事情。如果您使用套接字,请不要忘记检查您的防火墙设置。

其他可能的两种沟通方式涉及您可能需要学习的不同数量的工作和领域知识。这里有一个简要的大纲与优点和缺点。

命名管道

优点:在同一台机器上性能优良,容易用C来控制++。缺点:在机器边界上难以使用。

COM应用服务器

优点:易于消耗在C#的一面。一旦创建,便可以在C++端进行扩展。
缺点:可能难以调试,并且向现有项目添加支持非常棘手。也容易出现COM注册和调试头痛的问题。很难学习跨机器和用户会话边界使用。

共享内存

优点:性能超群,容易在C++来控制,适度容易在C#控制。
缺点:不能跨机器使用。尽管您可以为每一方创建一个缓冲区,并为缓冲区单向通信,但它们在共享缓冲区的过程中存在一些问题。如果您的应用程序之间的通信数量超过1:1,则这很难使用。

+0

您可以自由组合WSA和BSD套接字函数,无需选择/或。 – 2011-02-25 05:27:43

+1

我老了,本:)回到当天(Win9x)它是不安全的。 – meklarian 2011-02-25 05:30:26

+1

我会跳过所有其他选项,直接进入套接字和良好的OL'时尚终端式通信。它干净简单的实现,跨机器,语言,操作系统的作品,并且最好还是可操作的细微差别都很好理解。 – stephbu 2011-02-25 05:33:14