gpt4 book ai didi

包含结构数组的 C# 结构联合

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:35 27 4
gpt4 key购买 nike

我正在尝试创建多个结构的联合。我遇到一个包含另一个结构数组的结构的问题。

[StructLayout(LayoutKind.Explicit)]
public struct FruitBasket
{
[MarshalAs(UnmanagedType.Struct)]
[FieldOffset(0)]
public Apples Apple;

[FieldOffset(0)]
public Grapes Grape;

[FieldOffset(0)]
public Oranges Orange;
}

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi, Size = 12)]
public struct Apples
{
public int Color;
public int Texture;

[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 15)]
public Types[] Type;

}

如果我单独使用 Apples 结构,编码工作正常。但是,如果我尝试做类似的事情;

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi]
public class Buffet
{
public UInt32 NumMeats;

public UInt32 NumVeggies;

public FruitBasket NumFruits; //public Apples Apple; <-- works fine
}

我收到以下错误;

来自程序集“Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”的 FruitBasket',因为它包含偏移量为 0 的对象字段,该对象字段未正确对齐或与非对象字段重叠。

最佳答案

MarshalAsFieldOffsetStructLayout 有很大不同。 MarshalAs 只是一个“普通”参数,指示 Marshaller 如何编码字段,它修改结构的非托管布局。另一方面,当您在 C# 中使用 FieldOffset 时,它会直接修改结构的托管布局。 MarshalAs 对托管环境中的结构布局没有影响。因此,它不会使 Types 成为固定大小的值数组,因此 CLR 仍会提示引用被值重叠(包含在具有相同偏移量的其他结构之一中)。

对于原始类型,您可以使用fixed,但恐怕它不适用于Type。我猜你需要为“数组”的每个元素创建一个包含 15 个物理字段的结构。不要忘记它只有在 Types 是结构(或枚举)而不是引用时才有效。

不过,这通常不是常见问题的解决方案,仅适用于 P/Invoke。

关于包含结构数组的 C# 结构联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31975876/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com