• TypeLoadException: 未能从程序集“ECS.GUI.Define, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“ECS.GUI.Define.ArmgAimPos”,因为它在 4 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠


    TypeLoadException: 未能从程序集“ECS.GUI.Define, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“ECS.GUI.Define.ArmgAimPos”,因为它在 4 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠

    异常出现的关键字是:在4偏移位置处包含一个对象字段
    通过查找对象,该对象为共用体

    
        // StructLayout使设计者可以控制类或结构的数据字段的物理布局  
        // Explicit与FieldOffset一起可以控制每个数据成员的精确位置 
        [StructLayout(LayoutKind.Explicit)]
        public struct ArmgAimPos
        {
            [FieldOffset(0)] public BayType type;
            [FieldOffset(4)] public string ContainerID;
            [FieldOffset(8)] public string JobID; 
    
    

    使用FieldOffset属性实现共用体与强制类型转换

    使用字段开始的结构中的偏移量初始化 FieldOffsetAttribute 类的新实例。

    c# 
    public FieldOffsetAttribute (int offset);
    
    

    参数

    offset Int32

    从结构开始处到字段开始处的偏移量(以字节为单位)。

    可表示的概念为:原理实际上跟C++一样,将一个int[] 型的变量指向与byte[]型变量相同的内存区域,跟C++中将dat指向char数组的首地址是一样的。同样,这样的结构体功能与C++的共用体是一样的,即一个结构可以作为多种数据类型,而具体是什么类型视情况而定。

    修改异常方法:

    如提示标题所示:4偏移位置,已经有一个非对象字段了,所以,将偏移量向后移动即可解决

        // StructLayout使设计者可以控制类或结构的数据字段的物理布局  
        // Explicit与FieldOffset一起可以控制每个数据成员的精确位置 
        [StructLayout(LayoutKind.Explicit)]
        public struct ArmgAimPos
        {
            [FieldOffset(0)] public BayType type;
            [FieldOffset(8)] public string ContainerID; 
            [FieldOffset(16)] public string JobID; 
    
    

    [ FieldOffset( 8)] public string ContainerID;
    偏移量修改成了8 ,问题修复

  • 相关阅读:
    Python 基础【第三篇】输入和输出
    把linux可执行程序做成一个服务[转]
    linux 下启动程序的时候会显示坏的解释器,或者没有那个文件
    利用GDB进行多线程调试
    两个结构体ifconf和ifreq
    centos系统修改网络配置注意事项
    yum错误:rpmdb: BDB0113 Thread/process 4227/139813012539200 failed: BDB1507 Thread died in Berkeley DB library
    CentOs安装MySql
    周末遐想(计算最长英语单词链)
    单词词频统计(12组)
  • 原文地址:https://www.cnblogs.com/yuyue5945/p/14262827.html
Copyright © 2020-2023  润新知