封送处理时未固定可漂白结构数组吗?

时间:2018-11-17 13:47:07

标签: c#

来自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

我误会了吗?

0 个答案:

没有答案