Не могу вычислить размер unmanaged через Marshal.SizeOf структуры в C#
Есть некоторая структура переделанная из C в C#, так как библиотека (DLL) написана на C, но необходимо ее использовать в проекте на C#.
Вот код структуры на C#:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
#pragma warning disable IDE1006 // Naming Styles
public struct rtksvr_t
#pragma warning restore IDE1006 // Naming Styles
{
/* RTK server type */
public int state; /* server state (0:stop,1:running) */
public int cycle; /* processing cycle (ms) */
public int nmeacycle; /* NMEA request cycle (ms) (0:no req) */
public int nmeareq; /* NMEA request (0:no,1:nmeapos,2:single sol) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public double[] nmeapos; /* NMEA request position (ecef) (m) */
public int buffsize; /* input buffer size (bytes) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public int[] format; /* input format {rov,base,corr} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public solopt_t[] solopt; /* output solution options {sol1,sol2} */
public int navsel; /* ephemeris select (0:all,1:rover,2:base,3:corr) */
public int nsbs; /* number of sbas message */
public int nsol; /* number of solution buffer */
public rtk_t rtk; /* RTK control/result struct */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public int[] nb; /* bytes in input buffers {rov,base} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public int[] nsb; /* bytes in soulution buffers */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public int[] npb; /* bytes in input peek buffers */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] buff; /* input buffers {rov,base,corr} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] sbuf; /* output buffers {sol1,sol2} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] pbuf; /* peek buffers {rov,base,corr} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSOLBUF)]
public sol_t[] solbuf; /* solution buffer */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3 * 10)]
public int[] nmsg; /* input message counts */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public raw_t[] raw; /* receiver raw control {rov,base,corr} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public rtcm_t[] rtcm; /* RTCM control {rov,base,corr} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public gtime_t[] ftime; /* download time {rov,base,corr} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3 * MAXSTRPATH)]
public char[] files; /* download paths {rov,base,corr} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3 * MAXOBSBUF)]
public obs_t obs; /* observation data {rov,base,corr} */
public nav_t nav; /* navigation data */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSBSMSG)]
public sbsmsg_t sbsmsg; /* SBAS message buffer */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public stream_t stream; /* streams {rov,base,corr,sol1,sol2,logr,logb,logc} */
public IntPtr moni; /* monitor stream */
public uint tick; /* start tick */
public IntPtr thread; /* server thread */
public int cputime; /* CPU time (ms) for a processing cycle */
public int prcout; /* missing observation data count */
public int nave; /* number of averaging base pos */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public double[] rb_ave; /* averaging base pos */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3 * MAXRCVCMD)]
public char[] cmds_periodic; /* periodic commands */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXRCVCMD)]
public char[] cmd_reset; /* reset command */
public double bl_reset; /* baseline length to reset (km) */
public CRITICAL_SECTION lock_flag; /* lock flag */
};
Оригинальная структура на C:
typedef struct { /* RTK server type */
int state; /* server state (0:stop,1:running) */
int cycle; /* processing cycle (ms) */
int nmeacycle; /* NMEA request cycle (ms) (0:no req) */
int nmeareq; /* NMEA request (0:no,1:nmeapos,2:single sol) */
double nmeapos[3]; /* NMEA request position (ecef) (m) */
int buffsize; /* input buffer size (bytes) */
int format[3]; /* input format {rov,base,corr} */
solopt_t solopt[2]; /* output solution options {sol1,sol2} */
int navsel; /* ephemeris select (0:all,1:rover,2:base,3:corr) */
int nsbs; /* number of sbas message */
int nsol; /* number of solution buffer */
rtk_t rtk; /* RTK control/result struct */
int nb [3]; /* bytes in input buffers {rov,base} */
int nsb[2]; /* bytes in soulution buffers */
int npb[3]; /* bytes in input peek buffers */
unsigned char *buff[3]; /* input buffers {rov,base,corr} */
unsigned char *sbuf[2]; /* output buffers {sol1,sol2} */
unsigned char *pbuf[3]; /* peek buffers {rov,base,corr} */
sol_t solbuf[MAXSOLBUF]; /* solution buffer */
unsigned int nmsg[3][10]; /* input message counts */
raw_t raw [3]; /* receiver raw control {rov,base,corr} */
rtcm_t rtcm[3]; /* RTCM control {rov,base,corr} */
gtime_t ftime[3]; /* download time {rov,base,corr} */
char files[3][MAXSTRPATH]; /* download paths {rov,base,corr} */
obs_t obs[3][MAXOBSBUF]; /* observation data {rov,base,corr} */
nav_t nav; /* navigation data */
sbsmsg_t sbsmsg[MAXSBSMSG]; /* SBAS message buffer */
stream_t stream[8]; /* streams {rov,base,corr,sol1,sol2,logr,logb,logc} */
stream_t *moni; /* monitor stream */
unsigned int tick; /* start tick */
thread_t thread; /* server thread */
int cputime; /* CPU time (ms) for a processing cycle */
int prcout; /* missing observation data count */
int nave; /* number of averaging base pos */
double rb_ave[3]; /* averaging base pos */
char cmds_periodic[3][MAXRCVCMD]; /* periodic commands */
char cmd_reset[MAXRCVCMD]; /* reset command */
double bl_reset; /* baseline length to reset (km) */
lock_t lock; /* lock flag */
} rtksvr_t;
В C# пытаюсь инициализировать данную структуру:
DataRTK.rtksvr_t rtksvr;
int iSizeRTKSRV;
IntPtr rtksrv_ptr;
try
{
iSizeRTKSRV = Marshal.SizeOf(typeof(DataRTK.rtksvr_t));
}
catch(ArgumentException ex)
{
string strerr = ex.Message;
}
catch(TypeLoadException ex)
{
string strerr = ex.Message;
}
try
{
rtksrv_ptr = Marshal.AllocCoTaskMem(iSizeRTKSRV);
}
catch(ArgumentException ex)
{
string strerr = ex.Message;
}
DataRTK.rtksvr_t rtksrv = (DataRTK.rtksvr_t)(Marshal.PtrToStructure(rtksrv_ptr, typeof(DataRTK.rtksvr_t)));
При попытке узнать размер выдает ошибку System.ArgumentException со следующим сообщением:
Type 'RealTimeMonitor.DataRTK+rtksvr_t' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.
Из полезного может быть стек:
at System.Runtime.InteropServices.Marshal.SizeOfHelper(Type t, Boolean throwIfNotMarshalable)
at System.Runtime.InteropServices.Marshal.SizeOf(Type t)
at RealTimeMonitor.StreamHub.<WriteItems>d__139.MoveNext() in C:\Users\zharkov.v\source\repos\RealTimeMonitor\RealTimeMonitor\StreamHub.cs:line 138
Понимаю, что не может создать объект, но все же не могу понять в чем дело или я может пошел не тем путем. Без выделения памяти тоже выдает ошибку, что недостаточно памяти, поэтому переписал на этот вариант.
Кто может подсказать, что я делаю неправильно?
ОБНОВЛЕНО 12.02.2020
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
#pragma warning disable IDE1006 // Naming Styles
public struct rtk_t
#pragma warning restore IDE1006 // Naming Styles
{
/* RTK control/result type */
public sol_t sol; /* RTK solution */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public double[] rb; /* base position/velocity (ecef) (m|m/s) */
public int nx, na; /* number of float states/fixed states */
public double tt; /* time difference between current and previous (s) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public double[] x, P; /* float states and their covariance */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public double[] xa, Pa; /* fixed states and their covariance */
public int nfix; /* number of continuous fixes of ambiguity */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public ambc_t[] ambc; /* ambibuity control */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public ssat_t[] ssat; /* satellite status */
public int neb; /* bytes in error message buffer */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXERRMSG)]
public char[] errbuf; /* error message buffer */
public prcopt_t opt; /* processing options */
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
#pragma warning disable IDE1006 // Naming Styles
public struct solopt_t
#pragma warning restore IDE1006 // Naming Styles
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)] /* solution options type */
public int posf; /* solution format (SOLF_???) */
public int times; /* time system (TIMES_???) */
public int timef; /* time format (0:sssss.s,1:yyyy/mm/dd hh:mm:ss.s) */
public int timeu; /* time digits under decimal point */
public int degf; /* latitude/longitude format (0:ddd.ddd,1:ddd mm ss) */
public int outhead; /* output header (0:no,1:yes) */
public int outopt; /* output processing options (0:no,1:yes) */
public int outvel; /* output velocity options (0:no,1:yes) */
public int datum; /* datum (0:WGS84,1:Tokyo) */
public int height; /* height (0:ellipsoidal,1:geodetic) */
public int geoid; /* geoid model (0:EGM96,1:JGD2000) */
public int solstatic; /* solution of static mode (0:all,1:single) */
public int sstat; /* solution statistics level (0:off,1:states,2:residuals) */
public int trace; /* debug trace level (0:off,1-5:debug) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public double[] nmeaintv; /* nmea output interval (s) (<0:no,0:all) */
/* nmeaintv[0]:gprmc,gpgga,nmeaintv[1]:gpgsv */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] sep; /* field separator */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] prog; /* program name */
public double maxsolstd; /* max std-dev for solution output (m) (0:all) */
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
#pragma warning disable IDE1006 // Naming Styles
public struct sol_t
#pragma warning restore IDE1006 // Naming Styles
{
/* solution type */
public gtime_t time; /* time (GPST) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public double[] rr; /* position/velocity (m|m/s) */
/* {x,y,z,vx,vy,vz} or {e,n,u,ve,vn,vu} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public float[] qr; /* position variance/covariance (m^2) */
/* {c_xx,c_yy,c_zz,c_xy,c_yz,c_zx} or */
/* {c_ee,c_nn,c_uu,c_en,c_nu,c_ue} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public float[] qv; /* velocity variance/covariance (m^2/s^2) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public double[] dtr; /* receiver clock bias to time systems (s) */
public byte type; /* type (0:xyz-ecef,1:enu-baseline) */
public byte stat; /* solution status (SOLQ_???) */
public byte ns; /* number of valid satellites */
public float age; /* age of differential (s) */
public float ratio; /* AR ratio factor for valiation */
public float thres; /* AR ratio threshold for valiation */
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
#pragma warning disable IDE1006 // Naming Styles
public struct raw_t
#pragma warning restore IDE1006 // Naming Styles
{
/* receiver raw data control type */
public gtime_t time; /* message time */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT * (NFREQ + NEXOBS))]
public gtime_t tobs;//[MAXSAT*(NFREQ+NEXOBS)]; /* observation data time */
public obs_t obs; /* observation data */
public obs_t obuf; /* observation data buffer */
public nav_t nav; /* satellite ephemerides */
public sta_t sta; /* station parameters */
public int ephsat; /* sat number of update ephemeris (0:no satellite) */
public sbsmsg_t sbsmsg; /* SBAS message */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public char[] msgtype; /* last message type */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT * 380)]
public char[] subfrm; /* subframe buffer */
public lexmsg_t lexmsg; /* LEX message */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT * (NFREQ + NEXOBS))]
public double[] lockt; /* lock time (s) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public double[] icpp;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public double[] off;
public double icpc; /* carrier params for ss2 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public double[] prCA;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public double[] dpCA; /* L1/CA pseudrange/doppler for javad */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT * (NFREQ + NEXOBS))]
public byte[] halfc; /* half-cycle add flag */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXOBS)]
public char[] freqn; /* frequency number for javad */
public int nbyte; /* number of bytes in message buffer */
public int len; /* message length (bytes) */
public int iod; /* issue of data */
public int tod; /* time of day (ms) */
public int tbase; /* time base (0:gpst,1:utc(usno),2:glonass,3:utc(su) */
public int flag; /* general purpose flag */
public int outtype; /* output message type */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXRAWLEN)]
public byte[] buff; /* message buffer */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXOBS)]
public char[] opt; /* receiver dependent options */
public half_cyc_t half_cyc; /* half-cycle correction list */
public int format; /* receiver stream format */
public IntPtr rcv_data; /* receiver dependent data */
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
#pragma warning disable IDE1006 // Naming Styles
public struct rtcm_t
#pragma warning restore IDE1006 // Naming Styles
{
/* RTCM control struct type */
public int staid; /* station id */
public int stah; /* station health */
public int seqno; /* sequence number for rtcm 2 or iods msm */
public int outtype; /* output message type */
public gtime_t time; /* message time */
public gtime_t time_s; /* message start time */
public obs_t obs; /* observation data (uncorrected) */
public nav_t nav; /* satellite ephemerides */
public sta_t sta; /* station parameters */
public dgps_t dgps; /* output of dgps corrections */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public ssr_t[] ssr; /* output of ssr corrections */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public char[] msg; /* special message */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public char[] msgtype; /* last message type */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6 * 128)]
public char[] msmtype; /* msm signal types */
public int obsflag; /* obs data complete flag (1:ok,0:not complete) */
public int ephsat; /* update satellite of ephemeris */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT * (NFREQ + NEXOBS))]
public double[] cp; /* carrier-phase measurement */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT * (NFREQ + NEXOBS))]
public short[] time_lock; /* lock time */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT * (NFREQ + NEXOBS))]
public short[] loss; /* loss of lock count */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT * (NFREQ + NEXOBS))]
public gtime_t[] lltime; /* last lock time */
public int nbyte; /* number of bytes in message buffer */
public int nbit; /* number of bits in word buffer */
public int len; /* message length (bytes) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1200)]
public byte[] buff; /* message buffer */
public uint word; /* word buffer for rtcm 2 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
public uint[] nmsg2; /* message count of RTCM 2 (1-99:1-99,0:other) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 400)]
public uint[] nmsg3; /* message count of RTCM 3 (1-299:1001-1299,300-399:2000-2099,0:ohter) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public char[] opt; /* RTCM dependent options */
};
#region Структуры
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] /* time struct */
#pragma warning disable IDE1006 // Naming Styles
public struct gtime_t
#pragma warning restore IDE1006 // Naming Styles
{
public IntPtr time; /*(s) expressed by standard time_t */
public double sec; /*of second under 1 s */
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] /* observation data */
#pragma warning disable IDE1006 // Naming Styles
public struct obs_t
#pragma warning restore IDE1006 // Naming Styles
{
public int n, nmax; /*of obervation data/allocated */
public obsd_t data; /*data records */
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
#pragma warning disable IDE1006 // Naming Styles
public struct nav_t
#pragma warning restore IDE1006 // Naming Styles
{
/* navigation data type */
public int n, nmax; /* number of broadcast ephemeris */
public int ng, ngmax; /* number of glonass ephemeris */
public int ns, nsmax; /* number of sbas ephemeris */
public int ne, nemax; /* number of precise ephemeris */
public int nc, ncmax; /* number of precise clock */
public int na, namax; /* number of almanac data */
public int nt, ntmax; /* number of tec grid data */
public int nf, nfmax; /* number of satellite fcb data */
public eph_t eph; /* GPS/QZS/GAL ephemeris */
public geph_t geph; /* GLONASS ephemeris */
public seph_t seph; /* SBAS ephemeris */
public peph_t peph; /* precise ephemeris */
public pclk_t pclk; /* precise clock */
public alm_t alm; /* almanac data */
public tec_t tec; /* tec grid data */
public fcbd_t fcb; /* satellite fcb data */
public erp_t erp; /* earth rotation parameters */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public double[] utc_gps; /* GPS delta-UTC parameters {A0,A1,T,W} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public double[] utc_glo; /* GLONASS UTC GPS time parameters */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public double[] utc_gal; /* Galileo UTC GPS time parameters */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public double[] utc_qzs; /* QZS UTC GPS time parameters */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public double[] utc_cmp; /* BeiDou UTC parameters */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public double[] utc_irn; /* IRNSS UTC parameters */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public double[] utc_sbs; /* SBAS UTC parameters */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public double[] ion_gps; /* GPS iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public double[] ion_gal; /* Galileo iono model parameters {ai0,ai1,ai2,0} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public double[] ion_qzs; /* QZSS iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public double[] ion_cmp; /* BeiDou iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public double[] ion_irn; /* IRNSS iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */
public int leaps; /* leap seconds (s) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT * NFREQ)]
public double[] lam; /* carrier wave lengths (m) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT * 3)]
public double[] cbias; /* satellite dcb (0:p1-p2,1:p1-c1,2:p2-c2) (m) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXRCV * 2 * 3)]
public double[] rbias; /* receiver dcb (0:p1-p2,1:p1-c1,2:p2-c2) (m) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public double[] wlbias; /* wide-lane bias (cycle) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public double[] glo_cpbias; /* glonass code-phase bias {1C,1P,2C,2P} (m) */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXPRNGLO + 1)]
public char[] glo_fcn; /* glonass frequency channel number + 8 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public pcv_t[] pcvs; /* satellite antenna pcv */
public sbssat_t sbssat; /* SBAS satellite corrections */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXBAND + 1)]
public sbsion_t sbsion; /* SBAS ionosphere corrections */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public dgps_t dgps; /* DGPS corrections */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public ssr_t ssr; /* SSR corrections */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXSAT)]
public lexeph_t lexeph; /* LEX ephemeris */
public lexion_t lexion; /* LEX ionosphere correction */
public pppcorr_t pppcorr; /* ppp corrections */
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
#pragma warning disable IDE1006 // Naming Styles
public struct sbsmsg_t
#pragma warning restore IDE1006 // Naming Styles
{
/* SBAS message type */
public int week, tow; /* receiption time */
public int prn; /* SBAS satellite PRN number */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 29)]
public byte[] msg; /* SBAS message (226bit) padded by 0 */
};
[StructLayout(LayoutKind.Sequential)]
public struct CRITICAL_SECTION
{
public IntPtr DebugInfo;
public int LockCount;
public int RecursionCount;
public IntPtr OwningThread;
public IntPtr LockSemaphore;
public UIntPtr SpinCount;
}
Вроде все выложил. Если что-то забыл допишите.
ОБНОВЛЕНО 12.02.2020 13:28
Проблемы многие исправил, но осталась, которую не могу решить
Реализация на C
typedef struct half_cyc_tag { /* half-cycle correction list type */
unsigned char sat; /* satellite number */
unsigned char freq; /* frequency number (0:L1,1:L2,2:L5) */
unsigned char valid; /* half-cycle valid flag */
char corr; /* half-cycle corrected (x 0.5 cyc) */
gtime_t ts,te; /* time start, time end */
struct half_cyc_tag *next; /* pointer to next correction */
}half_cyc_t;
Реализовал на C# так
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
#pragma warning disable IDE1006 // Naming Styles
public struct half_cyc_t
#pragma warning restore IDE1006 // Naming Styles
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] /* half-cycle correction list type */
public byte sat; /* satellite number */
public byte freq; /* frequency number (0:L1,1:L2,2:L5) */
public byte valid; /* half-cycle valid flag */
public char corr; /* half-cycle corrected (x 0.5 cyc) */
public gtime_t ts, te; /* time start, time end */
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public unsafe half_cyc_t* next; /* pointer to next correction */
};
Выдает вот что
Cannot marshal field 'half_cyc' of type 'raw_t': The type definition of this field has layout information but has an invalid managed/unmanaged type combination or is unmarshalable.
Ответы (2 шт):
Как минимум, вот этот элемент выглядит ошибочным:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)] /* solution options type */
public int posf;
Управляемый тип int, а неуправляемый - массив?
Кроме того, у вас много других несоответствий, которые хоть и не могут привести к этой ошибке, но из-за них код не будет работать правильно. Например в неуправляемой структуре:
unsigned char *buff[3];
Это массив из трех указателей на байт
В управляемой:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] buff;
Это массив из трех байтов (значений). Они не эквивалентны. Проверьте все свои структуры, что они правильно используют типы в соответствии с рекомендациями Marshaling Data with Platform Invoke.
Не засчитал предыдущий ответ, как ответ, так как слишком он общий. И сам уже подобные ошибки исправил до появления ответа. Ну а теперь по порядку.
Ошибка №1
В структуре solopt_t удаляем строку [MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)] перед описанием элементов структуры.
Ошибка №2
В структуре exterr_t заменяем public double cerr; /* code errors (m) */ на public double[] cerr; /* code errors (m) */, так как перед ней стоит [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4 NFREQ 2)]
Ошибка №3
В структуре raw_t заменяем строку gtime tobs на gtime[] tobs - причина та же
Ошибка №4
В структуре obsd_t заменяем строку double L на double[] L... Ну вы уже поняли)))
Ошибка №5
В структуре raw_t заменяем строку lexeph_t lexeph на lexeph_t[] lexeph.
Ошибка №6
В структуре raw_t заменяем строку sbsion_t sbsion на sbsion_t[] sbsion.
Ошибка №7 Самая сложная, искал в другом месте, но оказалось... Удалить строку перед началом описания элементов [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
Ошибка №8
Структура rtksvr заменить sbsmsg_t sbsmsg на sbsmsg_t[] sbsmsg.
Ошибка №9
Структура rtksvr заменить obs_t obs на obs_t[] obs.
Ошибка №10
Структура rtksvr заменить stream_t obs на stream_t[] obs.
Можно было бы засчитать и предыдущий ответ, но я эти ошибки исправил, о которых он говорит, но зато не исправил, которые в нем не указаны и по поводу соответствия типов P/Invoke - совсем не в ту сторону, так как очень много пришлось перечитать.
PS Спасибо огромное моим друзьям из Павлодара, Караганды и особенно Таганрога за неоценимую помощь в решении данного вопроса и не только этого.