110,533
社区成员
发帖
与我相关
我的任务
分享
[StructLayout(LayoutKind.Sequential)]
public struct PrinterFields
{
public short dmOrientation;
//more
}
[StructLayout(LayoutKind.Sequential)]
public struct DisplayFields
{
//POINTL dmPosition;
public uint dmDisplayOrientation;
//more...
}
[StructLayout(LayoutKind.Explicit)]
public struct DEVMODEW
{
//replace 128 with real string size
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
[FieldOffset(0)]
public string dmDeviceName;
[FieldOffset(128)]
public short dmSpecVersion;
//define other fields with offset by yourself
//begin union, assumes union field offset starts from 136
[FieldOffset(136)]
public PrinterFields printerFields;
[FieldOffset(136)]
public PrinterFields displayFields;
//end union
//assumes remain fields' offset start from 154
[FieldOffset(154)]
public short dmColor;
//more...
}
包含union的struct如果要转成托管代码对应的struct,需要显示指定struct layout为explict,且显示标明field offset。
union中包含的各个成员的field offset设为相同。
BTW:原则上能用C++/CLI二次封装就别用PInvoke