保持从C ++编组到C#的数组

时间:2010-12-23 23:20:25

标签: c# interop marshalling com-interop

我在C#方法中使用像这样的参数将C ++中的整数数组传递给C#:

[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] 
UInt32[] myStuff,

当这些数据到达CLR时,我认为“LPArray”表示我正在使用来自C ++ - world的指针直接?所以如果我想在方法调用结束后保留​​这个数组,我应该复制它吗?

2 个答案:

答案 0 :(得分:1)

您必须要小心,在托管和非托管环境中使用相同的内存分配机制进行分配。即使是这种情况,制作副本并使用它也更安全。

注意:在您的示例中,指针未通过引用传递,因此被调用者只能添加到您之前的数组,而不是为您提供新数组。这真的是你的意图吗?

答案 1 :(得分:0)

从非托管代码调用托管代码(C ++到C#),数组被复制到完全托管的数组中。当垃圾收集器注意到没有人有任何对它的引用时,将释放此数组,而不是在函数退出时。

但是另一个方向更危险:如果你正朝着另一个方向(C#转换为C ++),那么它将:固定C#数组以便它不会移动,或者将数组的临时副本转换为非托管内存(当函数返回时会释放)。在任何一种情况下,在函数调用完成后保持C ++端的数组是不安全的,你想要将内容复制到其他地方。