2011-02-25 73 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