将带有字节数组的结构传递给interop-ed方法

我有一种情况,我必须将结构传递给C方法(在我的C#文件中声明为extern)。

然而,这个结构非常复杂。 我已经成功地使用了AllocHGlobal的方法,但我想了解是否可以通过仅传递对结构的引用来使它以这种方式工作。

[StructLayout(LayoutKind.Sequential)] struct lgLcdBitmapHeader { public Formats Format; } [StructLayout(LayoutKind.Explicit)] struct lgLcdBitmap { [FieldOffset(0)] public lgLcdBitmapHeader hdr; [FieldOffset(0)] public lgLcdBitmap160x43x1 bmp_mono; [FieldOffset(0)] public lgLcdBitmapQVGAx32 bmp_qvga32; } [StructLayout(LayoutKind.Sequential)] struct lgLcdBitmap160x43x1 : IDisposable { ///  /// Format = LGLCD_BMP_FORMAT_160x43x1 ///  public lgLcdBitmapHeader hdr; ///  /// byte array of size LGLCD_BMP_WIDTH * LGLCD_BMP_HEIGHT, use AllocHGlobal to make code safe ///  [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)BWBitmapSizes.Size)] internal byte[] pixels; } [StructLayout(LayoutKind.Sequential)] struct lgLcdBitmapQVGAx32 : IDisposable { ///  /// Format = LGLCD_BMP_FORMAT_160x43x1 ///  public lgLcdBitmapHeader hdr; ///  /// byte array of size LGLCD_QVGA_BMP_WIDTH * LGLCD_QVGA_BMP_HEIGHT * LGLCD_QVGA_BMP_BPP, use AllocHGlobal to make code safe ///  [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)QVGABitmapSizes.Size)] internal byte[] pixels; } 

最大的问题是我必须将所有内容都包装在一个联合(lgLcdBitmap结构)中。 实际上C#是抱怨的,因为在偏移0处有一个对象未​​正确对齐或与另一个对象重叠。

我认为问题与我的字节数组没有实际大小(只有使用SizeConst声明的那个)有关。 因为我不想使用fixed(它迫使我使用不安全的代码),我想了解如何解决这个问题。

我能想到的唯一想法是声明Size(在StructLayout内部)以允许C#理解我的结构的大小,但我不确定它是否有效。

我必须调用的方法是这样的:

 public extern static uint lgLcdUpdateBitmap([In] int device, [In] ref lgLcdBitmap bitmap, [In] Priorities priority); 

关于如何使一切运作的任何建议?

由于您不想使用fixed ,因此您的字节数组最好声明为IntPtr ,使用AllocHGlobal分配并使用Marshal.Copy填充数据。 没有办法让P / invoke marshaller使用MarshalAs做你需要的东西。

如果您在托管代码中不需要联合,请不要将其作为联合。 声明p / invoke函数的两个结构和两个重载。