【问题标题】:Interprocess communication between C# and C++C#和C++之间的进程间通信
【发布时间】:2025-12-30 22:50:09
【问题描述】:

我正在为具有 C++ API 接口的游戏编写机器人(即,当事件发生时,游戏会调用 Cpp dll 中的方法,该 dll 可以回调游戏中的方法以触发动作)。

我真的不想用 C++ 编写我的机器人,我是一个相当有经验的 C# 程序员,但我根本没有 C++ 经验。因此,显而易见的解决方案是使用 ipc 向 C# 程序发送事件,并将操作发送回 C++ 程序,这样我在 C++ 中只需要编写一个用于调用方法和发送事件的基本框架。

最好的方法是什么?示例代码将不胜感激,因为我现在没有特别想学习 C++!

【问题讨论】:

  • 是的。我已经使用管道编写了一个阻塞版本。但是游戏调用的任何方法都不允许阻止 - 我认为异步 ipc 会稍微推动它。老实说,我希望有某种已经编写好的框架或库可以使用,因为我只想做非常基本的 IPC

标签: c# .net c++ ipc


【解决方案1】:

一种解决方案是使用常规 __declspec(dllexport) 函数创建托管 C++ 类库,这些函数调用引用的 C# 类库中的托管方法。

示例 - 托管 C++ 项目中的 C++ 代码文件:

#include "stdafx.h"

__declspec(dllexport) int Foo(int bar) 
{
    csharpmodule::CSharpModule mod;
    return mod.Foo(bar);
}

C# 模块(解决方案中的单独项目):

namespace csharpmodule
{
    public class CSharpModule
    {
        public int Foo(int bar)
        {
            MessageBox.Show("Foo(" + bar + ")");
            return bar;
        }
    }
}

请注意,我通过使用System.Windows.Forms.MessageBox.Show 调用来证明这是一个实际的 .NET 调用。

基本(非 CLR)Win32 控制台应用程序示例:

__declspec(dllimport) int Foo(int bar);

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << Foo(5) << std::endl;
    return 0;
}

请记住将 Win32 控制台应用程序与生成托管 C++ 项目的 .lib 文件链接。

【讨论】:

    【解决方案2】:

    在这种情况下,我希望看到一个 C++/CLI 派对和一个使用 .NET Framework 的命名管道的 C# 派对。

    【讨论】:

      【解决方案3】:

      lots of different ways of doing IPC in Windows。对于 C# 到 C++,我很想在 C++ 下使用 Sockets 作为 API(一旦你了解它,WinSock 就可以了)并且 C# 非常简单。

      Named Pipes 可能会更好,但如果您不想使用套接字,并且专为 IPC 设计。 C++下的API看起来很简单,例如here

      【讨论】:

      • IPC 在同一台机器上绝对是命名管道的情况,套接字是次优的。
      • 我已经有一个使用命名管道的基本版本,但它会阻塞,导致游戏崩溃。我觉得异步 IO 会过度推动我的 C++ 功能:/
      • 异步 IO 不应该太难,我很确定你可以使用管道而不阻塞。如果没有,请准备好度过一个漫长的夜晚! @Aviad:是的,套接字可能没有那么好,但我想提供一个与 Aggelo 稍有对比的答案:)
      • 嗯,有一种方法“PeekNamedPipe”可以告诉你管道中有多少数据,但这似乎也阻塞了:/我看不到任何其他方法,除了异步.我想我必须这样做:/
      • codeproject.com/KB/dotnet/NamedPipeOverlapped.aspx - 快速谷歌后发现,它是在 C# 中,但让您了解如何使用管道进行简单的异步 IPC。