Здравствуйте. Возникла непонятная проблема с переводом структур из union С++ в шарп.
Вот с++ код
Код:
typedef struct {
byte_t abtAtqa[2];
byte_t btSak;
size_t szUidLen;
byte_t abtUid[10];
size_t szAtsLen;
byte_t abtAts[36];
} nfc_iso14443a_info_t;
typedef struct {
size_t szLen;
byte_t btResCode;
byte_t abtId[8];
byte_t abtPad[8];
byte_t abtSysCode[2];
} nfc_felica_info_t;
typedef struct {
byte_t abtAtqb[12];
byte_t abtId[4];
byte_t btParam1;
byte_t btParam2;
byte_t btParam3;
byte_t btParam4;
byte_t btCid;
size_t szInfLen;
byte_t abtInf[64];
} nfc_iso14443b_info_t;
typedef struct {
byte_t btSensRes[2];
byte_t btId[4];
} nfc_jewel_info_t;
typedef struct {
byte_t NFCID3i[10];
byte_t btDID;
byte_t btBSt;
byte_t btBRt;
} nfc_dep_info_t;
typedef union {
nfc_iso14443a_info_t nai;
nfc_felica_info_t nfi;
nfc_iso14443b_info_t nbi;
nfc_jewel_info_t nji;
nfc_dep_info_t ndi;
} nfc_target_info_t;
вот как переписал в шарп
Код:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct nfc_iso14443a_info_t
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] abtAtqa;
public byte btSak;
public UInt32 szUidLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] abtUid;
public UInt32 szAtsLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 36)]
public byte[] abtAts;
} ;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct nfc_felica_info_t
{
UInt32 szLen;
public byte btResCode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] abtId;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] abtPad;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] abtSysCode;
} ;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct nfc_iso14443b_info_t
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] abtAtqb;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] abtId;
public byte btParam1;
public byte btParam2;
public byte btParam3;
public byte btParam4;
public byte btCid;
public UInt32 szInfLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] abtInf;
} ;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct nfc_jewel_info_t
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] btSensRes;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] btId;
} ;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct nfc_dep_info_t
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] NFCID3i;
public byte btDID;
public byte btBSt;
public byte btBRt;
} ;
[StructLayout(LayoutKind.Explicit, Pack = 1)]
struct nfc_target_info_t
{
[FieldOffset(0)]
public nfc_iso14443a_info_t nai;
[FieldOffset(0)]
public nfc_felica_info_t nfi;
[FieldOffset(0)]
public nfc_iso14443b_info_t nbi;
[FieldOffset(0)]
public nfc_jewel_info_t nji;
[FieldOffset(0)]
public nfc_dep_info_t ndi;
} ;
при попытке вызвать код
Код:
nfc_target_info_t ti = new nfc_target_info_t();
получаю ошибку:
Цитата:
Не удалось загрузить тип "nfc_target_info_t" из сборки "CardTester, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", так как он содержит поле объекта со смещением 0, которое неверно выровнено или перекрыто полем, не представляющим объект.
|
Что не так?? Баловался по всякому, и задавал параметр Size = кратному 8 размеру структур. Но он дает ошибку и все тут.
Может кто знает что тут не так?