我有一个Win32 C++游戏端项目,我想创建一个可以动态连接的C#进程。然后,C++进程可以将调试数据发送到C#进程,并且C#控制台可以将调试命令发送到C++进程。我知道这可以做到,但我不知道该怎么做。有人知道吗?如何使C#控制台实用程序附加到C++ exe?
回答
有很多的沟通方式跨进程。为了您的目的,我建议您使用套接字在两者之间进行通信,因为如果您愿意,这也可以让您在机器之间进行通信;并且使用套接字的语义在两种语言中都是相似的。
在C#端,您可以通过在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,则这很难使用。
我正在做一些非常类似的事情,在我正在使用的其中一个项目中使用命名管道。尽管我没有在实施方面努力,但它似乎很好地完成了这项工作。以下链接提供了一个很好的概述。
http://msdn.microsoft.com/en-us/library/aa365590(v=vs.85).aspx
- 1. c控制台程序
- 2. C#控制台应用程序
- 3. Visual Studio 2010通过“附加到进程”调试C++控制台应用程序
- 4. 如何使用shell32.dll中从C++控制台应用程序
- 5. 为多个实例构建C#控制台应用程序
- 6. 两件事;控制台应用程序运行没有.exe和参数(C#控制台应用程序)
- 7. 如何将C#控制台应用程序作为单个exe部署?
- 8. 控制台应用程序发布EXE
- 9. 如何在c#控制台应用程序中使用参数?
- 10. 如何获得控制台的进程id在C#控制台应用程序
- 11. 如何将C#控制台应用程序移植到Windows Phone
- 12. 使用C#控制台加载Javascript应用程序
- 13. 将状态栏添加到C++控制台应用程序
- 14. 将音乐文件添加到C++控制台应用程序
- 15. 如何在控制台程序中使用一行(C++)
- 16. C++控制台应用程序MVC
- 17. C#控制台应用程序 -
- 18. C#控制台和Windows应用程序
- 19. C++控制台应用程序
- 20. 控制台应用程序帮助! C#
- 21. C#控制台应用程序部署
- 22. 控制台应用程序拖放“C#”
- 23. 运行C#控制台应用程序
- 24. C#控制台应用程序图标
- 25. 在C#控制台应用程序
- 26. C#无控制台应用程序
- 27. C# - 在控制台应用程序
- 28. 如何从Java程序连续输入到EXE的控制台?
- 29. 如何编译使用PlaySound函数的C++控制台应用程序?
- 30. C#控制一个控制台进程
术语“附加”并不意味着什么。使用标准的进程间通信机制。 .NET和C++都支持命名管道,套接字,内存映射文件,WM_COPYDATA。这样做在过程中总是简单得多。 – 2011-02-25 05:01:25