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