Всем привет.
Помогите решить проблему.
Как правильно отмаршалить структуры?
Есть структуры описаные на С++
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;
Все равно получаю предыдущую ошибку. Подскажите решение проблемы, плз.