将C ++结构与Union联合编组

我正在尝试围绕Nikon DS-QI2相机SDK(仅提供C ++ dll)实现C#包装器。

由于大小不匹配,我正在努力处理结构数据。 dll正在使用指向结构数组的指针,因此使结构匹配以从传递给dll方法的指针中检索数据非常重要。

在面对结构内的联合之前,一切都还不错。 例如:

如果我在C ++中定义以下结构

doSomethingWithUser

在C#中应该是

struct CAM_Variant
{
    ECamVariantRunType  eVarType;
    lx_int32                i32Value;
    lx_uint32               ui32Value;
    lx_int64                i64Value;
    lx_uint64               ui64Value;
    double                  dValue;
    bool                    bValue;
    void*                   pValue;
    lx_wchar                wszValue[CAM_FEA_VARIANT_MAX];
    CAM_Area                stArea;
    CAM_Position            stPosition;
    CAM_TriggerOption       stTriggerOption;
    CAM_MultiExposureTime   stMultiExposureTime;
    CAM_Format              stFormat;
}

并且都具有664字节的大小。

问题是实际的C ++结构实现了联合

[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
public struct CAM_Variant
{
    public ECamVariantRunType eVarType;
    public Int32 i32Value;
    public UInt32 ui32Value;
    public Int64 i64Value;
    public UInt64 ui64Value;
    public double dValue;
    public byte bValue;
    public IntPtr pValue;
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 256)]
    public string wszValue;
    public CAM_Area stArea;
    public CAM_Position stPosition;
    public CAM_TriggerOption stTriggerOption;
    public CAM_MultiExposureTime stMultiExposureTime;
    public CAM_Format stFormat;
}

和sizeof(CAM_Variant)现在返回520个字节。 如果将Pack = 1添加到StructLayout属性中,则C#结构仅将大小减小为657个字节。

我需要什么样的法术才能使结构在内存和大小上匹配,以便可以将它们转换为结构数组? 谢谢!

编辑:其他相关问题。 为什么我的完整C ++结构的大小为520字节,而下面的大小为516字节。因为数组将更大的成员定义为并集,所以它们不应该相等吗?而且由于CAM_FEA_VARIANT_MAX = 512,下面的一个对我来说看起来正确,而另一个对我不正确。

struct CAM_Variant
{
    ECamVariantRunType  eVarType;
    union
    {
        lx_int32                i32Value;
        lx_uint32               ui32Value;
        lx_int64                i64Value;
        lx_uint64               ui64Value;
        double                  dValue;
        bool                    bValue;
        void*                   pValue;
        lx_wchar                wszValue[CAM_FEA_VARIANT_MAX];
        CAM_Area                stArea;
        CAM_Position            stPosition;
        CAM_TriggerOption       stTriggerOption;
        CAM_MultiExposureTime   stMultiExposureTime;
        CAM_Format              stFormat;
    };
}

编辑2:看起来好像是双重添加了4个随机字节,我不明白为什么...

xyj_future 回答:将C ++结构与Union联合编组

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3152744.html

大家都在问