【发布时间】:2010-12-31 13:07:47
【问题描述】:
我有一个如下所示的 C++ 结构:
struct unmanagedstruct
{
int flags;
union
{
int offset[6];
struct
{
float pos[3];
float q[4];
} posedesc;
} u;
};
我正试图在 C# 中像这样编组它:
[StructLayout(LayoutKind.Explicit)]
public class managedstruct {
[FieldOffset(0)]
public int flags;
[FieldOffset(4), MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6)]
public int[] offset;
[StructLayout(LayoutKind.Explicit)]
public struct posedesc {
[FieldOffset(0), MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3)]
public float[] pos;
[FieldOffset(12), MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
public float[] q;
}
[FieldOffset(4)]
public posedesc pose;
}
但是,当我尝试将数据加载到我的结构中时,只有 offset 数组的前 3 个元素存在(数组的长度为 3)。我可以确认它们的值是正确的——但我仍然需要其他 3 个元素。我是不是做错了什么?
我正在使用这些函数来加载结构:
private static IntPtr addOffset(IntPtr baseAddress, int byteOffset) {
switch (IntPtr.Size) {
case 4:
return new IntPtr(baseAddress.ToInt32() + byteOffset);
case 8:
return new IntPtr(baseAddress.ToInt64() + byteOffset);
default:
throw new NotImplementedException();
}
}
public static T loadStructData<T>(byte[] data, int byteOffset) {
GCHandle pinnedData = GCHandle.Alloc(data, GCHandleType.Pinned);
T output = (T)Marshal.PtrToStructure(addOffset(pinnedData.AddrOfPinnedObject(), byteOffset), typeof(T));
pinnedData.Free();
return output;
}
加载示例:
managedstruct mystruct = loadStructData<managedstruct>(buffer, 9000);
如果您需要更多信息,请告诉我。
【问题讨论】:
-
编组代码应该如何知道何时将联合编组为
int[]或float[]?它应该为每个数组元素选择,还是总是一个或另一个?
标签: c# c++ struct marshalling unions