[英]Calling a C++ DLL from C# with unions
我正在从C ++ DLL接收回调,并且需要接受如下所示的结构:
typedef struct {
union {
SXAnyDevice any_device;
SXInternalDevice internal;
SXExternalDevice external;
}
int device_type;
} SXDevice;
我创建了在C#中引用的结构,并设置了显式布局,但是由于在联合中引用的结构的大小并不相同,因此我在设置device_type字段的FieldOffset时遇到了问题。
[StructLayout(LayoutKind.Explicit, CharSet=CharSet.Ansi)]
public struct SXDevice {
[FieldOffset(0)]
public SXAnyDevice any_device;
[FieldOffset(0)]
public SXInternalDevice internal_device;
[FieldOffset(0)]
public SXExternalDevice external_device;
[FieldOffset(**Not sure how to handle this**)]
public int device_type;
}
任何想法如何最好地做到这一点?
如何快速获取偏移量:使用C ++中offsetof(SXDevice, device_type)
返回的值。
偏移量说明:
工会占用的空间与其最大的组成部分一样多。
令maxSize
= max(sizeof(SXAnyDevice), sizeof(SXInternalDevice), sizeof(SXExternalDevice))
现在,一切都取决于它在C ++端的配置方式:
#pragma pack(1)
),那么device_type
偏移量将仅等于maxSize
maxSize
与下一个包边界对齐 指定用于打包的值(以字节为单位)。 如果未为模块设置编译器选项/ Zp,则n的默认值为8。有效值为1、2、4、8和16。成员的对齐方式将是多个的边界。 n或成员大小的倍数,以较小者为准。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.