本文综合 Microsoft .NET 互操作文档、Unity 官方手册与 IL2CPP 技术博客、Android JNI 官方指南、xLua 文档等业界资料(文末列出),从原理、类型规则、各平台差异到大厂的工程实践做一次系统梳理。
零、一句话和一个比方
Marshalling 是把数据从一种语言的内存表示,转换成另一种语言能正确理解的内存表示,并处理好"谁分配、谁释放、这段时间内存会不会被挪走"的过程。
比方:跨国寄货与报关
C# 和 C++ 像两个国家:
| 两国差异 | 编程中的对应 |
|---|---|
| 货币不同 | 类型大小不同:C#bool和 C++bool字节数可能不一致 |
| 文字不同 | 字符串编码不同:C# 用 UTF-16,C/C++ 常用 UTF-8 |
| 仓库管理方式不同 | C# 有垃圾回收(GC),C++ 手动管理内存 |
| 包装规格不同 | 结构体的字段排列和对齐方式可能不同 |