我想通过包装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;
}
答案 0 :(得分:3)
它已经很好了,没有必要帮忙。
C#中的结构类型自动获取[StructLayout]属性。默认值为Sequential,打包为8.这与非托管代码中默认使用的打包类型相同。无论如何,当结构中只有一个字段时无关紧要。
请确保您不添加任何字段,也不要使用自动属性。您可以使用Marshal.SizeOf()仔细检查,它应该是32位模式下的4和64位模式下的8。或者换句话说,等于IntPtr.Size
答案 1 :(得分:0)
添加[StructLayout(LayoutKind.Sequential,Pack = 1)]只会影响结构中变量的对齐,而不会影响它自身变量的大小。它们仍然是32位/ 64位。