Маршаллинг массива пользовательского типа из C++ DLL
От: Xak.PC Россия  
Дата: 14.07.09 10:52
Оценка:
Здравствуйте.
У меня есть следующая струткура

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;    

        };

Очень жду советов.
Re: Маршаллинг массива пользовательского типа из C++ DLL
От: Calabon Ниоткуда  
Дата: 14.07.09 19:28
Оценка:
Здравствуйте, 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;
   };
Re: Маршаллинг массива пользовательского типа из C++ DLL
От: Calabon Ниоткуда  
Дата: 14.07.09 19:30
Оценка:
Создать объект?!

Руками.

MetaData data = new MetaData()


А как ещё?!
Re: Маршаллинг массива пользовательского типа из C++ DLL
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 14.07.09 19:42
Оценка: 2 (2)
Здравствуйте, Xak.PC, Вы писали:

XP>Здравствуйте.

XP>У меня есть следующая струткура

XP>Каким образом мне создать объект этого типа в C# приложении? Насколько я знаю необходимо выполнить маршаллинг, но как его делать для массива пользовательского типа?


XP>Очень жду советов.


Ну для начала стоит уяснить для себя, что unsigned char != System.Char. На самом деле unsigned char — это System.Byte (по крайней мере это так для MSVC++)
[КУ] оккупировала армия.
Re[2]: Маршаллинг массива пользовательского типа из C++ DLL
От: Xak.PC Россия  
Дата: 15.07.09 12:23
Оценка:
Здравствуйте, 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>

Да. Все как обычно чертовски просто. Спасибо!
Re[2]: Маршаллинг массива пользовательского типа из C++ DLL
От: Xak.PC Россия  
Дата: 15.07.09 12:24
Оценка:
Здравствуйте, koandrew, Вы писали:

K>Здравствуйте, Xak.PC, Вы писали:


XP>>Здравствуйте.

XP>>У меня есть следующая струткура

XP>>Каким образом мне создать объект этого типа в C# приложении? Насколько я знаю необходимо выполнить маршаллинг, но как его делать для массива пользовательского типа?


XP>>Очень жду советов.


K>Ну для начала стоит уяснить для себя, что unsigned char != System.Char. На самом деле unsigned char — это System.Byte (по крайней мере это так для MSVC++)


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