使用StructureToPtr将C#结构编组到C ++

我有C#类:

namespace Models { [StructLayout(LayoutKind.Explicit, Size = 120, CharSet = CharSet.Unicode)] public struct DynamicState { [FieldOffset(0)] public double[] Position; [FieldOffset(24)] public double[] Velocity; [FieldOffset(48)] public double[] Acceleration; [FieldOffset(72)] public double[] Attitude; [FieldOffset(96)] public double[] AngularVelocity; } } 

和C ++ / CLI方法:

 Models::DynamicState SomeClassClr::DoSomething(Models::DynamicState ds) { int struct_size = Marshal::SizeOf(ds); System::IntPtr ptr = Marshal::AllocHGlobal(struct_size); DynamicStateStruct ds_struct; struct_size = sizeof(ds_struct); Marshal::StructureToPtr(ds, ptr, false); ds_struct = *(DynamicStateStruct*)ptr.ToPointer(); Models::DynamicState returnVal; mpSomeClass->doSomething(ds_struct); return returnVal; } 

其中DynamicStateStruct是本机C ++类:

 struct DynamicStateStruct { double mPosition[3]; double mVelocity[3]; double mAcceleration[3]; double mAttitude[3]; double mAngularVelocity[3]; }; 

当我在本机C ++中恢复结构( ds_struct )时,我没有得到正确的值,我缺少什么想法?

请尝试以下变体:

 public struct DynamicState { [MarshalAs (UnmanagedType.ByValArray, SizeConst=3)] public double[] Position; [MarshalAs (UnmanagedType.ByValArray, SizeConst=3)] public double[] Velocity; [MarshalAs (UnmanagedType.ByValArray, SizeConst=3)] public double[] Acceleration; [MarshalAs (UnmanagedType.ByValArray, SizeConst=3)] public double[] Attitude; [MarshalAs (UnmanagedType.ByValArray, SizeConst=3)] public double[] AngularVelocity; } 

另一种选择是在不安全的代码中使用固定数组:

 public unsafe struct DynamicState { public fixed double Position[3]; public fixed double Velocity[3]; public fixed double Acceleration[3]; public fixed double Attitude[3]; public fixed double AngularVelocity[3]; } 

PS关于.Net互操作的好指南可以在这里找到: http : //www.mono-project.com/Interop_with_Native_Libraries