简体   繁体   中英

C# System.TypeLoadException: Could not load type because it contains an object field at offset - code from .net framework on .net core

I'm trying to use ets2sdk library in .net core project (originally written in .net framework).

Loading this Type causes exception:

System.TypeLoadException: Could not load type 'Ets2SdkData' from assembly 'x' because it contains an object field at offset 20 that is incorrectly aligned or overlapped by a non-object field.

Type Body:

[StructLayout(LayoutKind.Explicit)]
public struct Ets2SdkData
{
    [FieldOffset(0)]
    public uint time;
    [FieldOffset(4)]
    public uint paused;

    [FieldOffset(8)]
    public uint ets2_telemetry_plugin_revision;
    [FieldOffset(12)]
    public uint ets2_version_major;
    [FieldOffset(16)]
    public uint ets2_version_minor;

    // ***** REVISION 1 ****** //

    [FieldOffset(20)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public byte[] flags;

    // vehicle dynamics

    [FieldOffset(24)]
    public float speed;
    [FieldOffset(28)]
    public float accelerationX;
    [FieldOffset(32)]
    public float accelerationY;
    [FieldOffset(36)]
    public float accelerationZ;


    [FieldOffset(40)]
    public float coordinateX;
    [FieldOffset(44)]
    public float coordinateY;
    [FieldOffset(48)]
    public float coordinateZ;


    [FieldOffset(52)]
    public float rotationX;
    [FieldOffset(56)]
    public float rotationY;
    [FieldOffset(60)]
    public float rotationZ;

    // drivetrain essentials

    [FieldOffset(64)]
    public int gear;
    [FieldOffset(68)]
    public int gears;
    [FieldOffset(72)]
    public int gearRanges;
    [FieldOffset(76)]
    public int gearRangeActive;

    [FieldOffset(80)]
    public float engineRpm;
    [FieldOffset(84)]
    public float engineRpmMax;

    [FieldOffset(88)]
    public float fuel;
    [FieldOffset(92)]
    public float fuelCapacity;
    [FieldOffset(96)]
    public float fuelRate;
    [FieldOffset(100)]
    public float fuelAvgConsumption;

    // user input

    [FieldOffset(104)]
    public float userSteer;
    [FieldOffset(108)]
    public float userThrottle;
    [FieldOffset(112)]
    public float userBrake;
    [FieldOffset(116)]
    public float userClutch;


    [FieldOffset(120)]
    public float gameSteer;
    [FieldOffset(124)]
    public float gameThrottle;
    [FieldOffset(128)]
    public float gameBrake;
    [FieldOffset(132)]
    public float gameClutch;

    // truck & trailer

    [FieldOffset(136)]
    public float truckWeight;
    [FieldOffset(140)]
    public float trailerWeight;

    [FieldOffset(144)]
    public int modelOffset;
    [FieldOffset(148)]
    public int modelLength;

    [FieldOffset(152)]
    public int trailerOffset;
    [FieldOffset(156)]
    public int trailerLength;


    // ***** REVISION 2 ****** //
    [FieldOffset(160)]
    public int timeAbsolute;
    [FieldOffset(164)]
    public int gearsReverse;

    [FieldOffset(168)]
    public float trailerMass;
    [FieldOffset(172)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] trailerId;
    [FieldOffset(236)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] trailerName;

    [FieldOffset(300)]
    public int jobIncome;
    [FieldOffset(304)]
    public int jobDeadline;

    [FieldOffset(308)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] jobCitySource;
    [FieldOffset(372)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] jobCityDestination;

    [FieldOffset(436)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] jobCompanySource;
    [FieldOffset(500)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] jobCompanyDestination;

    // ***** REVISION 3 ****** //
    [FieldOffset(564)]
    public int retarderBrake;
    [FieldOffset(568)]
    public int shifterSlot;
    [FieldOffset(572)]
    public int shifterToggle;
    //[FieldOffset(576)]
    //public int fill;

    [FieldOffset(580)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
    public byte[] aux;
    [FieldOffset(604)]
    public float airPressure;
    [FieldOffset(608)]
    public float brakeTemperature;
    [FieldOffset(612)]
    public int fuelWarning;
    [FieldOffset(616)]
    public float adblue;
    [FieldOffset(620)]
    public float adblueConsumption;
    [FieldOffset(624)]
    public float oilPressure;
    [FieldOffset(628)]
    public float oilTemperature;
    [FieldOffset(632)]
    public float waterTemperature;
    [FieldOffset(636)]
    public float batteryVoltage;
    [FieldOffset(640)]
    public float lightsDashboard;
    [FieldOffset(644)]
    public float wearEngine;
    [FieldOffset(648)]
    public float wearTransmission;
    [FieldOffset(652)]
    public float wearCabin;
    [FieldOffset(656)]
    public float wearChassis;
    [FieldOffset(660)]
    public float wearWheels;
    [FieldOffset(664)]
    public float wearTrailer;
    [FieldOffset(668)]
    public float truckOdometer;
    [FieldOffset(672)]
    public float cruiseControlSpeed;

    [FieldOffset(676)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] truckMake;
    [FieldOffset(740)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] truckMakeId;
    [FieldOffset(804)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] truckModel;

    // ***** REVISION 4 ****** //
    [FieldOffset(868)]
    public float speedLimit;

    [FieldOffset(872)]
    public float routeDistance;

    [FieldOffset(876)]
    public float routeTime;

    [FieldOffset(880)]
    public float fuelRange;

    [FieldOffset(884)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
    public float[] gearRatioForward;

    [FieldOffset(980)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public float[] gearRatioReverse;

    [FieldOffset(1012)]
    public float gearRatioDifferential;

    [FieldOffset(1016)]
    public int gearDashboard;

    [FieldOffset(1020)] public byte onJob;
    [FieldOffset(1021)] public byte jobFinished;

    public bool GetBool(Ets2SdkBoolean i)
    {
        if (i == Ets2SdkBoolean.TrailerAttached)
            return flags[1] > 0;
        return aux[(int)i] > 0;
    }
}

Of course, in the original .net framework demo project class works.

Problem is probably with not DWORD aligned array: link

But as far I know, I cannot change the size of arrays (it's the map of C++ object in SharedMemory).

And I have no idea how to handle that problem - and why that code is working on .net framework.

Any suggestions?

I've used different library: link . And code is now working.

It works same way, but has different data struct:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
internal struct Ets2TelemetryStructure
{
    public uint time;
    public uint paused;

    public uint ets2_telemetry_plugin_revision;
    public uint ets2_version_major;
    public uint ets2_version_minor;

    // ***** REVISION 1 ****** //

    public short engine_enabled;
    public short trailer_attached;

    public float speed;
    public float accelerationX;
    public float accelerationY;
    public float accelerationZ;

    public float coordinateX;
    public float coordinateY;
    public float coordinateZ;

    public float rotationX;
    public float rotationY;
    public float rotationZ;

    public int gear;
    public int gears;
    public int gearRanges;
    public int gearRangeActive;

    public float engineRpm;
    public float engineRpmMax;

    public float fuel;
    public float fuelCapacity;
    public float fuelRate;
    public float fuelAvgConsumption;

    public float userSteer;
    public float userThrottle;
    public float userBrake;
    public float userClutch;

    public float gameSteer;
    public float gameThrottle;
    public float gameBrake;
    public float gameClutch;

    public float TruckMass;
    public float trailerWeight;

    public int modelOffset;
    public int modelLength;

    public int trailerOffset;
    public int trailerLength;

    public int timeAbsolute;
    public int gearsReverse;

    public float trailerMass;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] trailerId;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] trailerName;

    public int jobIncome;
    public int jobDeadline;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] jobCitySource;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] jobCityDestination;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] jobCompanySource;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] jobCompanyDestination;

    // ***** REVISION 3 ****** //

    public int retarderBrake;
    public int shifterSlot;
    public int shifterToggle;
    public int fill;

    public byte cruiseControl;
    public byte wipers;

    public byte parkBrake;
    public byte motorBrake;

    public byte electricEnabled;
    public byte engineEnabled;

    public byte blinkerLeftActive;
    public byte blinkerRightActive;
    public byte blinkerLeftOn;
    public byte blinkerRightOn;

    public byte lightsParking;
    public byte lightsBeamLow;
    public byte lightsBeamHigh;
    public byte lightsAuxFront;
    public byte lightsAuxRoof;
    public byte lightsBeacon;
    public byte lightsBrake;
    public byte lightsReverse;

    public byte batteryVoltageWarning;
    public byte airPressureWarning;
    public byte airPressureEmergency;
    public byte adblueWarning;
    public byte oilPressureWarning;
    public byte waterTemperatureWarning;

    public float airPressure;
    public float brakeTemperature;
    public float fuelWarning;
    public float adblue;
    public float adblueConsumption;
    public float oilPressure;
    public float oilTemperature;
    public float waterTemperature;
    public float batteryVoltage;
    public float lightsDashboard;
    public float wearEngine;
    public float wearTransmission;
    public float wearCabin;
    public float wearChassis;
    public float wearWheels;
    public float wearTrailer;
    public float truckOdometer;
}

It seems to .net core has some problems with handling not correctly aligned arrays - in this library replaced by two, short variables. I think it's a bug in previously used library, like Pavel Anikhouski said in comment.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM