我已经为外部定义的数据包定义了一个 struct 体,如下所示:

[StructLayout(LayoutKind.Explicit, Size=18, Pack=1, CharSet=CharSet.Ansi)]
struct FlexTransmission
{
    [FieldOffset(0), MarshalAs(UnmanagedType.U4, SizeConst =4)]
       public UInt32 transmissionTime;
    [FieldOffset(4),MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)]
       public byte[] flexData;           // size 13 bytes
    [FieldOffset(17)]
       public byte transmissionNumber;
}

然而,这个 struct 被编译器认为是错误的(#11,.NET 7):

System.TypeLoadException:‘无法从程序集’Flex,版本=1.0.0.0,区域性=中性,PublicKeyToken=NULL‘加载类型’Flex.FlexTransport‘,因为它在偏移量4处包含的对象字段未正确对齐或与非对象字段重叠.’

我看不出重叠处在哪里.在C#中,UInt32肯定不会占用超过4个字节?

推荐答案

显式布局是关于数据如何存储在托管空间中的,这要求引用必须与引用大小对齐.实际上,您不应该对任何包含引用的内容使用显式布局-这里的数组:就是引用.

我想知道你是不是应该用fixed buffer,而不是用byte[]that没有这个限制:

public unsafe fixed byte flexData[13];

Csharp相关问答推荐

使用C#中的Shape API从Azure目录获取所有用户

如何使用C#中的图形API更新用户配置文件图像

. NET在上一个操作完成之前,在此上下文实例上启动了第二个操作

为什么我的ASP.NET核心MVC应用程序要为HTML元素添加一些标识符?

实现List T,为什么LINQ之后它不会返回MyList?<>(无法强制转换WhereListIterator `1类型的对象)'

图形API基于appid列表检索多个应用程序

具有单一导航属性的EF核心一对多关系

Quartz调度程序不调用作业(job)类

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

如何忽略API JSON响应中的空字符串?

N层解决方案上的依赖注入-删除样板

Polly重试URL复制值

用C#从XML内部元素中获取特定值

在等待OnGetAsync时打开Razor Page显示微调器

为什么我的自定义Json.net转换器不工作?

C#USB条形码 scanner 在第二次扫描时未写入行尾字符

如何在.NET MAUI上在iOS和Mac之间共享代码?(no条件编译和无代码重复)

.NET EF Core Automapper项目到筛选不起作用

通过mini kube中的远程调试Pod与从emoteProcessPickerScript中解析错误输出的代码错误进行比较

从具有泛型类型约束的类继承-Blazor