来自Blittable and Non-Blittable Types
以下复杂类型也是可钝化的类型:
可Blittable类型的一维数组,例如整数数组。但是,包含blittable类型的可变数组的类型本身不是blittable。
仅包含可blittable类型的格式化值类型(以及将其封送为格式化类型的类)。有关格式化的值类型的更多信息,请参见值类型的默认封送处理。
和
作为一种优化,只包含可blittable成员的可blittable类型和类的数组是固定的,而不是在编组过程中复制的。
因此,根据上述文档,封送处理时将固定一个可blittable结构的数组。但是,当我在一个简单的程序中尝试时,在托管和c ++端得到了数组的两个不同地址。
// c#
[StructLayout(LayoutKind.Sequential)]
public struct MyPoint
{
public int x;
public int y;
}
public class Program
{
public static void Main()
{
var array = new MyPoint[1];
var handle = GCHandle.Alloc(array, GCHandleType.Pinned);
Console.WriteLine("0x" + handle.AddrOfPinnedObject().ToString("X"));
LibWrap.TestPinningOfArrayOfStructs(array);
}
}
public class LibWrap
{
[DllImport("..\\LIB\\PinvokeLib.dll")]
public static extern void TestPinningOfArrayOfStructs(MyPoint[] pointArray);
}
// c++
typedef struct _MYPOINT
{
int x;
int y;
} MYPOINT;
PINVOKELIB_API void WINAPI TestPinningOfArrayOfStructs( MYPOINT* p )
{
printf("0x%p\n", p);
}
输出为
0x26322FC
0x005CC3A8
我误会了吗?