【发布时间】:2017-06-30 21:09:25
【问题描述】:
我必须定义一个使用不安全代码的结构,所以我必须设置每个字段的 FieldOffset 值。但我无法定义指针的大小。这是代码:
[StructLayout(LayoutKind.Explicit)]
public struct SomeStructO
{
public SomeStructO(int theNumber)
{
TheNumber = theNumber;
Coordinates = PointF.Empty;
SomeNumbers = null;
}
[FieldOffset(0)]
public PointF Coordinates;
[FieldOffset(sizeof(float) * 2)]
public int[] SomeNumbers;
[FieldOffset(sizeof(float) * 2 + IntPtr.Size)]
public int TheNumber;
}
给出错误,因为 IntPtr.Size 不是常量表达式 当然这个也不编译:
Marshal.SizeOf(typeof(IntPtr))
归结为问题标题,更多的是如何在 FieldOffset 定义中设置特定的“32bit 64bit compile”指针数据大小。
编辑:我也不能放“public int[] SomeNumbers;”结构末尾的字段,因为我的结构中有 2 个不同的数组.. 比如“public int[] SomeOtherNumbers;”
【问题讨论】:
-
你有一个更大的问题,你不能编组一个包含数组的结构。除非您使用 UnmanagedType.ByValArray,否则它看起来不像您想要的那样。仅将其声明为 IntPtr 并自己编组数组是一种解决方法。请对照本机声明检查这一点,这很不寻常,因为它是如此令人头疼的内存管理。否则,上述问题的解决方案非常微不足道,根本不要使用 [FieldOffset]。它什么也没做。 LayoutKind.Sequential 已经足够好了。
-
出于好奇。你为什么给你的结构一个
StructLayout属性?也许还有另一种方法更适合您正在尝试做的事情。 -
我必须在不安全的块中使用结构,当我不使用 StructLayout 时会出错
-
你是如何使用 unsafe 块中的结构体的?
-
实际上我正在研究这个,我还没有弄清楚。我正在尝试 .net 的 PointF 结构,因为它可以在不安全的块中使用,我能够获取数据但无法将一些浮点值直接写入指针浮点地址:(
标签: c# pointers struct sizeof structlayout