在 Unity 中,C# 常负责游戏逻辑,C++ 则可能负责引擎底层、原生 SDK 或高性能算法。
当 C# 调用 C++ 时,问题不只是“找到一个函数”,还包括:
- C# 的字符串,C++ 应该怎样读取?
- 两边的结构体,内存布局是否相同?
- C++ 返回的内存,应该由谁释放?
- 编辑器正常,为什么真机上会崩溃?
C# 与 C++ 互操作的核心,是让两种语言对数据布局、调用方式和生命周期达成一致。
这与 ILRuntime 的跨域继承适配不同。这里讨论的是托管代码与原生代码之间的互操作,核心技术包括 P/Invoke、封送处理(Marshalling)和原生插件。
一、先分清两座不同的“桥”
Unity 中的“C# 到 C++”,常见有两种含义。
1. C# 调用原生 C++ 插件
C# 游戏逻辑 ↓ P/Invoke 原生插件导出的 C 接口 ↓ C++ 实现例如调用语音 SDK、图像处理库或自研算法库。
本文重点讨论这一种。