| 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. Но что именно не так непонятно, как правильно записать такой тип?
 
 |