我正在尝试围绕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个随机字节,我不明白为什么...