当前位置: 首页 > 编程语言 > C#

使用StructureToPtr将C#结构编组为C++分享

时间:2023-04-10 13:46:24 C#

使用StructureToPtr将C#结构编写到C++我有C#类:namespaceModels{[StructLayout(LayoutKind.Explicit,Size=120,CharSet=CharSet.Unicode)]publicstructDynamicState{[FieldOffset(0)]publicdouble[]位置;[FieldOffset(24)]publicdouble[]速度;[FieldOffset(48)]publicdouble[]加速度;[FieldOffset(72)]publicdouble[]态度;[FieldOffset(96)]publicdouble[]AngularVelocity;}}和C++/CLI方法:Models::DynamicStateSomeClassClr::DoSomething(Models::DynamicStateds){intstruct_size=Marshal::SizeOf(ds);System::IntPtrptr=Marshal::AllocHGlobal(struct_size);动态状态结构ds_struct;struct_size=sizeof(ds_struct);元帅::StructureToPtr(ds,ptr,false);ds_struct=*(DynamicStateStruct*)ptr.ToPointer();模型::动态状态返回值;mpSomeClass->doSomething(ds_struct);返回返回值;}其中DynamicStateStruct是本机C++类:structDynamicStateStruct{doublemPosition[3];双mVelocity[3];双mAcceleration[3];双倍的m态度[3];双mAngularVelocity[3];};当我在本机C++中恢复结构(ds_struct)时,我没有得到正确的值,知道我遗漏了什么吗?试试这个变体:publicstructDynamicState{[MarshalAs(UnmanagedType.ByValArray,SizeConst=3)]publicdouble[]Position;[MarshalAs(UnmanagedType.ByValArray,SizeConst=3)]publicdouble[]Velocity;[MarshalAs(UnmanagedType.ByValArray,SizeConst=3)]publicdouble[]加速;[MarshalAs(UnmanagedType.ByValArray,SizeConst=3)]publicdouble[]态度;[MarshalAs(UnmanagedType.ByValArray,SizeConst=3)]publicdouble[]AngularVelocity;}另一种选择是在不安全代码中使用固定数组:publicunsafestructDynamicState{publicfixeddoublePosition[3];公共固定双速度[3];公共固定双加速[3];publicfixeddoubleAttitude[3];publicfixeddoubleAngularVelocity[3];PS一个很好的.Netinterop指南可以在这里找到:http://www.mono-project.com/Interop_with_Native_Libraries以上是C#学习教程:UsingStructureToPtrtoC#StructuremarshallingtoallthecontentbyC++sharedbyC++,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: