一、先把问题摆清楚
1.1 一段看起来毫无悬念的代码
[DllImport("NativePlugin", CharSet = CharSet.Ansi)] static extern int SetPlayerName(string name);extern "C" __declspec(dllexport) int SetPlayerName(const std::string& name) { g_player.name = name; // 直接接住 return 0; }托管代码传string,原生代码收const std::string&,中间没有任何显式转换,编译也通过了。这就是所谓的"自动转换"。
但这行代码里其实藏着四套彼此独立的机制,任何一套没对上,就会出现"在开发机上好好的,上线中文全是问号":
| 层 | 谁在做转换 | 转成什么 | 出错时的表现 |
|---|---|---|---|
| C# 调用方 | — | 传一个托管string | — |