日期:2014-05-19  浏览次数:20995 次

托管与托管数据类型之间的转换
typedef   struct   _LPR_RESULT
{
struct   _LPR_RESULT*   pNext; //头,下一个识别结果的指针

char license[16]; //车牌
char color[8]; //颜色
int nColor;
int type; //车牌类型
int reliability; //整牌可信度
RECT location; //车牌在整个图像中的位置
int bright; //亮度评价

int msDecode; //解码图片的时间
int msDetect; //车牌检测的时间
int msLocate; //定位的时间
int msRecognise; //识别的时间
int msEncode; //压缩生成图片的时间

LPBYTE pBits; //整车图片
int cbBits; //整车图片图片的大小 DWORD dwReserved[61]; //保留
}LPR_RESULT;

typedef   struct   tagRECT
{
        LONG         left;
        LONG         top;
        LONG         right;
        LONG         bottom;
}   RECT

有这样两个数据结构要转化为C#中托管的数据为型,关键问题是
  1.

    LPR_RESULT 结构中的成员   struct   _LPR_RESULT*   pNext;该如何转化,
 
  2   .内存
      LRP_RESULT   结构中的成员   LPBYTE pBits;   表示一个内存块,该如何转换(在C#)


------解决方案--------------------
帮你顶
------解决方案--------------------
1.

LPR_RESULT 结构中的成员 struct _LPR_RESULT* pNext;该如何转化,

_LPR_RESULT在C#中定义成类就可以了。类是引用类型,封送到非托管内存就是指针了。

2 .内存
LRP_RESULT 结构中的成员 LPBYTE pBits; 表示一个内存块,该如何转换(在C#)

你可以在C#中直接申请一块非托管内存或用Byte数组实现。
------解决方案--------------------
up
------解决方案--------------------
//看看这样可以吗
public struct LPR_RESULT
{
IntPtr pNext; //头,下一个识别结果的指针
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
char[] license; //车牌
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
char[] color; //颜色
int nColor;
int type; //车牌类型
int reliability; //整牌可信度
RECT location; //车牌在整个图像中的位置
int bright; //亮度评价

int msDecode; //解码图片的时间
int msDetect; //车牌检测的时间
int msLocate; //定位的时间
int msRecognise; //识别的时间
int msEncode; //压缩生成图片的时间

IntPtr pBits; //整车图片
int cbBits; //整车图片图片的大小
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 61)]
uint [] dwReserved; //保留
};

------解决方案--------------------
转换好像在MSDN上就有,里面有详细的叙述
------解决方案--------------------
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 61)]

改成:
[MarshalAs( UnmanagedType.LPArray)]

因为非托管是指针类型的!
------解决方案--------------------
UP