这个C#结构是否保证具有所需的大小?

时间:2013-08-07 11:45:29

标签: c# marshalling

我想通过包装IntPtr

来创建一个类型安全的指针结构
struct Pointer<T>
{
    private IntPtr ptr;

    // methods marshalling from and to T
}

但我也希望能够像Pointer<T>那样整理IntPtr个实例,因此它们需要具有相同的大小和布局。这有保证吗?

如果没有,是否添加

[StructLayout(LayoutKind.Sequential, Pack = 1)]

在顶部?

基本上,最后我应该能够编组这个C结构

struct Foo {
    int *data;
};

使用这个C#结构:

struct Foo
{
    public Pointer<int> data;
}

2 个答案:

答案 0 :(得分:3)

它已经很好了,没有必要帮忙。

C#中的结构类型自动获取[StructLayout]属性。默认值为Sequential,打包为8.这与非托管代码中默认使用的打包类型相同。无论如何,当结构中只有一个字段时无关紧要。

请确保您不添加任何字段,也不要使用自动属性。您可以使用Marshal.SizeOf()仔细检查,它应该是32位模式下的4和64位模式下的8。或者换句话说,等于IntPtr.Size

答案 1 :(得分:0)

添加[StructLayout(LayoutKind.Sequential,Pack = 1)]只会影响结构中变量的对齐,而不会影响它自身变量的大小。它们仍然是32位/ 64位。