C#和C++结构体转化的问题

问题描述

程序通过命名管道在C#和C++之间互发结构体,2边定义的结构体顺序和大小都一样,但是还原结构体的时候总是对不上,请大侠们帮找下问题所在,谢谢...C++定义结构体为:typedefstruct__CoData{intEvents;intPing;intType;boolxxxxx;boolyyyyy;intNum;}CoData;

C#定义的结构体:[Serializable][StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]publicstructstCommunicationData{publicintEvents;publicintPing;publicintType;publicboolxxxxx;publicboolyyyyy;publicintNum;}

C#接收到结构体之后的转换:publicstaticObjectBytesToStruct(Byte[]bytes,TypestrcutType){Int32size=Marshal.SizeOf(strcutType);IntPtrbuffer=Marshal.AllocHGlobal(size);if(size>bytes.Length){returnnull;}try{Marshal.Copy(bytes,0,buffer,size);returnMarshal.PtrToStructure(buffer,strcutType);}finally{Marshal.FreeHGlobal(buffer);}}

网上挺多这方面例子的,但是我始终转换不对.....起初怀疑是管道通信出了问题,将结构体去掉后,只在C++和C#间发0123456789,能够正常接收,排除了管道的问题。加上结构体,我用C#做了一个发送一个接收,一切正常。对C++不熟,实在是不知道上面哪个地方出了问题

解决方案

解决方案二:
来个神人吧.....
解决方案三:
没有神人出现,咱一晚上没睡好觉,解决问题了。特别关注一下这个bool,是个大麻烦.....
解决方案四:
c#中缺省会认为导进来的是类似于vc中BOOL的类型,所以会是4个字节(32位机上)而,而如果在vc++中返回的是bool(仅是1个字节),当然会出错!解决的两种办法:1.VC中返回BOOL(或是直接返回int);2.在c#中加上关键字:MarshalAs(UnmanagedType.I1);
解决方案五:
问题解决了吗?
解决方案六:
用这个:[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]publicstructCoData{publicintEvents;publicintPing;publicintType;[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.I1)]publicboolxxxxx;[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.I1)]publicboolyyyyy;publicintNum;}

解决方案七:
该回复于2012-10-14 16:40:45被版主删除

时间: 2024-10-30 19:46:38

C#和C++结构体转化的问题的相关文章

Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析_C 语言

本文以实例详细描述了Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect的定义及用法,具体如下所示: 1.NSRange: NSRange的原型为 typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; NSMakeRange的函数: NS_INLINEz是内联函数 typedef NSRange *NSRangePointer; NS_IN

Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect

本节要点:红色标记 需要记下来 1 NSRange typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; NSMakeRange 的函数 NS_INLINEz是内联函数 typedef NSRange *NSRangePointer; NS_INLINE NSRange NSMakeRange(NSUInteger loc, NSUInteger len) { NSRange r; r.locat

数据转化-c++和c#数据类型转化,结构体怎么转化

问题描述 c++和c#数据类型转化,结构体怎么转化 问题如下:有2个c++结构体: typedef struct _AlarmStatus { char deviceid[24]; // 报警设备编码 char status[16]; // 报警设备状态:ONDUTY,OFFDUTY,ALARM }AlarmStatus; typedef struct _DeviceStatus { int result; // 查询结果标志:0成功,1失败 char online[8]; // 是否在线:ON

unity3d-C#中如何将网络接收到的byte[]类型的数据转化为自定义的结构体类型

问题描述 C#中如何将网络接收到的byte[]类型的数据转化为自定义的结构体类型 自定义结构体类型为: public struct Data { float x; float y; float z; float heading; float pitch; float roll; } C#用byte[] buf 接受C++服务器发来的数据,之后我如何才能将buf中的数据放到Data data中呢? 解决方案 使用实体类 byteToString 转化成 json 对象

Linux下的串口编程:struct termios结构体

termios结构体说明 termios结构体中,该结构体一般包括如下的成员: tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_t     c_cc[NCCS]; 其具体意义如下 c_iflag:输入模式标志,控制终端输入方式,具体参数如下所示. c_iflag参数表 键值说明 IGNBRK 忽略BREAK键输入 BRKINT 如果设置了IGNBRK,BREAK键的输入将被忽略,如果设置了BRK

dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗

问题描述 dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗 dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以直接通过这个指针读取它的成员变量吗? 解决方案 当然是可以的.但是更好的方式是把分配内存的工作交给调用者去做.因为这样不容易忘记释放内存.申请和释放的代码成对出现. 参考windows api里的GetWindowRect,它由调用者传入一个lpRect结构体指针,函数获取了窗口坐标,填充它. 解决方案二: 只要是在同一个

Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)

进程状态 volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ 1 1 state成员的可能取值如下 参见http://lxr.free-electrons.com/source/include/linux/sched.h?v=4.5#L207 /* * Task state bitmask. NOTE! These bits are also * encoded in fs/proc/array.c: get_task

C#中怎么读取Struct(结构体)文件!!!!???大虾帮帮我啊。。。。。

问题描述 做项目需要读取一个.DAT文件,这个文件是别人给的,里面记录了一些调试需要用到的参数,是用结构体(Struct)写成的,用的是C++写的.....现在我拿到了这个.dat文件的结构,里面大致形式为(嵌套的结构体):structA{...structB{....structC{.....}}}好像用C++读取很容易,但我目前的软件都是用C#写的,只能在C#里面读了,这个要怎么读啊?网上找了一些资料,看上去好复杂,哪位大虾能详细的讲一下啊,谢谢!!!!还有,我曾经想过是否可以用C++写一个

江湖救急:vc结构体字符数组VB.NET如何使用的问题!!

问题描述 vc下的结构体:typedefstructtagIDData{charName[32];charSex[4];charNation[6];charBorn[18];}IDData;Data_stdcallGetDataMsg();我在VB.net中:DeclareFunctionGetDataMsgLib"IDRead.DLL"()AsIDDataStructureIDCardData<VBFixedstring(32)>DimName()Asstring<