当将 class 从 c# 编组到本机 c++ 时,它会克隆吗?

When marshalling a class from c# to native c++ does it clone?

如果我有像

这样的 C# 代码
[DllImport("SomeDll")]
private static extern void passAClass(ClassType myClass);

并这样称呼它

ClassType myClass = new ClassType();
passAClass(myClass);

我可以看到 class(它的数据段)作为指针传递给 dll,但我不确定运行时是否将 class 数据从它的位置复制到新的内存,然后传递指向新内存的指针,或者直接传递指向 class 的内存位置的指针。

我可以看到,如果 dll 更改了内存中的数据,它会收到一个指向的指针,该更改在调用后在 c# 中可见,但这可能是因为它又将内存复制回了托管 class 已存储。

but that could be because it does yet another copy of memory back

不,这不是自动的,您必须明确地为参数提供 [Out] 属性以确保它复制回来。您确实看到没有属性的更改的事实证明 class 是 blittable。换句话说,class' 字段都是简单的值类型,它们没有被 CLR 重新排列。因此托管布局与非托管布局相同,允许 pinvoke 编组器固定对象并传递指针。

这并不罕见。最好不要让它成为意外,例如,当您将本机代码移植到 x64 时,您可能会在下雨天失去一天的生命。为 class 提供 [StructLayout] 属性以确保顺序布局是个好主意。