繁体   English   中英

使用联合从C#调用C ++ DLL

[英]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与下一个包边界对齐

来自#pragma pack docs

指定用于打包的值(以字节为单位)。 如果未为模块设置编译器选项/ Zp,则n的默认值为8。有效值为1、2、4、8和16。成员的对齐方式将是多个的边界。 n或成员大小的倍数,以较小者为准。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM