Incorrectly aligned or overlapped by a non-object field.
От: Butia  
Дата: 22.01.07 11:51
Оценка:
Всем привет.
Помогите решить проблему.
Как правильно отмаршалить структуры?

Есть структуры описаные на С++

struct SwiNotifyVariant
{
    SWI_TYPE_Notify  eNotify;
    union
    {
    SWI_STRUCT_HeartBeat          _HeartBeat;
        SWI_STRUCT_NetworkStatus      _NetworkStatus;
        ...        
     }


где

SWI_TYPE_Notify - enum,

struct SWI_STRUCT_HeartBeat
{
    U32    sizeStruct;
}

struct SWI_STRUCT_NetworkStatus
{
    U32                     sizeStruct;            //size of this structure
    SWI_TYPE_ServiceStatus  eServiceStatus;        //status of service
    SWI_TYPE_ServiceType    eServiceType;        //service type
    SWI_TYPE_RoamingState   eRoaming;            //roaming state
    SWI_TYPE_ModeSelection  eModeSelection;        //mode selection
    TCHAR                   szCountry[5];        //country 
    TCHAR                   szNetwork[9];        //network
    U32                     nMCC;                //MCC
    U32                     nMNC;                //MNC
    U32                     nLAC;                //LAC
    U32                     nCellID;            //cell ID
};

SWI_TYPE_ServiceStatus , SWI_TYPE_ServiceType, SWI_TYPE_RoamingState, SWI_TYPE_ModeSelection - enum.



в Шарпе описываю структуры так


    [StructLayout(LayoutKind.Explicit)]
    public struct SwiNotifyVariant
    {
        [FieldOffset(0)]
        public SWI_TYPE_Notify eNotify;
        [FieldOffset(4)]
        public SWI_STRUCT_HeartBeat            _HeartBeat;
        [FieldOffset(4)]
        public SWI_STRUCT_NetworkStatus     _NetworkStatus;
        ...
    }


[StructLayout(LayoutKind.Sequential)]
public struct SWI_STRUCT_HeartBeat
{
    public uint    sizeStruct;    
}

    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
    public struct SWI_STRUCT_NetworkStatus
    {
        [FieldOffset(0)]
        public uint sizeStruct;            //size of this structure
        [FieldOffset(4)]
        public SWI_TYPE_ServiceStatus eServiceStatus;        //status of service
        [FieldOffset(8)]
        public SWI_TYPE_ServiceType eServiceType;        //service type
        [FieldOffset(12)]
        public SWI_TYPE_RoamingState eRoaming;            //roaming state
        [FieldOffset(16)]
        public SWI_TYPE_ModeSelection eModeSelection;        //mode selection
        [FieldOffset(20)]
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
        public string szCountry;
        [FieldOffset(28)]
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
        public string szNetwork;        //network
        [FieldOffset(40)]
        public uint nMCC;                //MCC
        [FieldOffset(44)]
        public uint nMNC;                //MNC
        [FieldOffset(48)]
        public uint nLAC;                //LAC
        [FieldOffset(52)]
        public uint nCellID;            //cell ID
        [FieldOffset(56)]
     }


Проблема такая:
Если в структуре SWI_STRUCT_NetworkStatus такое описание

        [FieldOffset(20)]
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
        public string szCountry;
        [FieldOffset(25)]
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
        public string szNetwork;



то получаю такую ошибку

Could not load type 'Sierra.SWI_STRUCT_NetworkStatus' from assembly 'NewSMSPack, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because it contains an object field at offset 25 that is incorrectly aligned or overlapped by a non-object field.

Оказалось что должно быть выравнивание типа DWORD , т.е 5 байт = 8 байт.
Делаю такое описание
        [FieldOffset(20)]
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
        public string szCountry;
        [FieldOffset(28)]
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
        public string szNetwork;        //network
        [FieldOffset(40)]
        public uint nMCC;


получаю ошибку:

Could not load type 'Sierra.SwiNotifyVariant' from assembly 'BulkSms, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because it contains an object field at offset 4 that is incorrectly aligned or overlapped by a non-object field.


Пробовал описывать структуры с LayoutKind.Sequential , также пробовал использовать разные значения Pack, также пробовал описывать
    
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
        public bytte[] szCountry;


Все равно получаю предыдущую ошибку. Подскажите решение проблемы, плз.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.