Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема в переводе union в С#  (Прочитано 5001 раз)
0 Пользователей и 1 Гость смотрят эту тему.
skromnjaga
Гость
« : 23-01-2009 18:59 » 

Есть сторонняя дллка, в ней используется такой замудренный тип:

typedef struct
{
  UINT32 Format;   
  ....
  UINT32 Interlace;
} VSLIB3_DATA_ATTRIBUTE_STREAM_FRAME;

typedef struct
{
  UINT32 Format;   
  ....
  UINT32 BlockLines;
} VSLIB3_DATA_ATTRIBUTE_STREAM_LINE;

typedef struct
{
  UINT32 TotalBlocks;
  .....
  UINT32 SizeX,SizeY;             
} VSLIB3_DATA_ATTRIBUTE_STREAM_VSFAST;

typedef struct
{
  VS_SIZE_T FromBit;             
  UINT32    BlockStepBit;         
  UINT32    PixelBits;                
  UINT16    StreamBitsShift[32];   
  UINT32    SizeX,SizeY;             
} VSLIB3_DATA_ATTRIBUTE_STREAM_MULTIFRAME;

typedef struct
{
  UINT32 SyncSource;                   
  ....         
  UINT32 GlowTimeA,GlowTimeB;           
} VSLIB3_DATA_ATTRIBUTE_GATED_OPTIC;

typedef struct
{
  UINT32 Format;   
  .... 
  UINT32 Interlace;
} VSLIB3_DATA_ATTRIBUTE_VS_LINK_FRAME;


typedef union
{
  VSLIB3_DATA_ATTRIBUTE_STREAM_FRAME           StreamFrame;
  VSLIB3_DATA_ATTRIBUTE_STREAM_LINE            StreamLine;
  VSLIB3_DATA_ATTRIBUTE_STREAM_VSFAST          StreamVsFast;
  VSLIB3_DATA_ATTRIBUTE_STREAM_MULTIFRAME      VsMultiFrame;
  VSLIB3_DATA_ATTRIBUTE_GATED_OPTIC            GatedOptic;
  VSLIB3_DATA_ATTRIBUTE_VS_LINK_FRAME          VsLinkFrame;
} VSLIB3_DATA_ATTRIBUTE;

typedef struct
{
   UINT32     TransferBits;   
   VS_SIZE_T  TransferSize;   
   UINT32     Type;           
   UINT32     AddOnDataType;  
   UINT32     AddOnDataSize;   
   VSLIB3_DATA_ATTRIBUTE Attribute;  
   UINT32     Inited;
}VSLIB3_DATAHEADER;

Почитав форумы и покопавшись в мсдне пришел к такому решению

[StructLayout(LayoutKind.Sequential)]
    public struct VSLIB3_DATA_ATTRIBUTE_STREAM_FRAME
    {
        uint Format;   
        .... 
        uint Interlace;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct VSLIB3_DATA_ATTRIBUTE_STREAM_LINE
    {
        uint Format;   
        .... 
        uint BlockLines;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct VSLIB3_DATA_ATTRIBUTE_STREAM_VSFAST
    {
        uint TotalBlocks;
        ....
        uint SizeX,SizeY;             
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct VSLIB3_DATA_ATTRIBUTE_STREAM_MULTIFRAME
    {
        Int64 FromBit;                 
        uint    BlockStepBit;           
        uint    PixelBits;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
        UInt16[]    StreamBitsShift;     
        uint    SizeX,SizeY;             
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct VSLIB3_DATA_ATTRIBUTE_GATED_OPTIC
    {
        uint SyncSource;
        .....
        uint GlowTimeA,GlowTimeB; 
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct VSLIB3_DATA_ATTRIBUTE_VS_LINK_FRAME
    {
        uint Format;   
        .... 
        uint Interlace;
    }
    [StructLayout(LayoutKind.Explicit)]
    public struct VSLIB3_DATA_ATTRIBUTE
    {
        [FieldOffset(0)]
        VSLIB3_DATA_ATTRIBUTE_STREAM_FRAME StreamFrame;
        [FieldOffset(0)]
        VSLIB3_DATA_ATTRIBUTE_STREAM_LINE StreamLine;
        [FieldOffset(0)]
        VSLIB3_DATA_ATTRIBUTE_STREAM_VSFAST StreamVsFast;
        [FieldOffset(0)]
        VSLIB3_DATA_ATTRIBUTE_STREAM_MULTIFRAME VsMultiFrame;
        [FieldOffset(0)]
        VSLIB3_DATA_ATTRIBUTE_GATED_OPTIC GatedOptic;
        [FieldOffset(0)]
        VSLIB3_DATA_ATTRIBUTE_VS_LINK_FRAME VsLinkFrame;
    }
    [StructLayout(LayoutKind.Explicit)]
    public struct VSLIB3_DATAHEADER
    {
        uint TransferBits;
        Int64 TransferSize;
        uint Type;
        uint AddOnDataType;
        uint AddOnDataSize;
        VSLIB3_DATA_ATTRIBUTE Attribute;
        uint Inited;
    }

Но при компиляции возникает ошибка

"Не удалось загрузить тип "VideoScan.VSLIB3_DATA_ATTRIBUTE" из сборки "VideoScan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", так как он содержит поле объекта со смещением 0, которое неверно выровнено или перекрыто полем, не представляющим объект."

Методом тыка нашел что ошибка возникает из-за массива в типе VSLIB3_DATA_ATTRIBUTE_STREAM_MULTIFRAME. Но что именно не так непонятно, как правильно записать такой тип?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines