Здравствуйте.
У меня есть следующая струткура
struct TMeteoParam
{
unsigned char SensorNum;
unsigned char ParCode;
unsigned char ParErr;
float ParData;
};
struct TMeteoData
{
unsigned long MeteoID;
METEO_TIME MeteoTime;
unsigned long ParCnt;
TMeteoParam ParArray[255];
};
Каким образом мне создать объект этого типа в C# приложении? Насколько я знаю необходимо выполнить маршаллинг, но как его делать для массива пользовательского типа?
[StructLayout(LayoutKind.Sequential)]
private struct TMeteoParam
{
public Char ParCode;
public Char ParErr;
public float ParData;
};
[StructLayout(LayoutKind.Sequential)]
private struct TMeteoData
{
public UInt32 MeteoID;
public METEO_TIME MeteoTime;
public UInt32 ParCnt;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U8, SizeConst = 255)] // Это если массив известного типа, а в моем случае как?
public byte[] ParArray;
};
Очень жду советов.
Здравствуйте, Xak.PC, Вы писали:
XP>XP>struct TMeteoParam
XP>{
XP> unsigned char SensorNum;
XP> unsigned char ParCode;
XP> unsigned char ParErr;
XP> float ParData;
XP>};
XP>[c#]
XP> [StructLayout(LayoutKind.Sequential)]
XP> private struct TMeteoParam
XP> {
XP> // ГДЕ SensorNum??? Из-за таких ошибок можно 5 часов сидеть дебажить и думать что не так :)
XP> public Char ParCode;
XP> public Char ParErr;
XP> public float ParData;
XP> };
Вот.
Думаю так. Пробуй :)
[ccode]
[StructLayout(LayoutKind.Sequential)]
struct MeteoData
{
public UInt32 MeteoID;
public METEO_TIME MeteoTime;
public UInt32 ParCnt;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 255)]
public MeteoParam[] ParArray;
};
Создать объект?!
Руками.
MetaData data = new MetaData()
А как ещё?!
Здравствуйте, Calabon, Вы писали:
XP>> // ГДЕ SensorNum??? Из-за таких ошибок можно 5 часов сидеть дебажить и думать что не так
Это не ошибка, просто разные версии кода. Раньше я просто разбил массив структур на несколько массивов, но библиотеку обновили и я подумал что править ее каждый раз мне не с руки.
Здравствуйте, Calabon, Вы писали:
C>C> [StructLayout(LayoutKind.Sequential)]
C> struct MeteoData
C> {
C> public UInt32 MeteoID;
C> public METEO_TIME MeteoTime;
C> public UInt32 ParCnt;
C> [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 255)]
C> public MeteoParam[] ParArray;
C> };
C>
Да. Все как обычно чертовски просто. Спасибо!