日期:2014-05-18  浏览次数:20854 次

C#中怎样定义C++中的类型
大家好,我有一个C++的结构体和一个函数声明要在C#中定义,但是对C#中类型不是很了解,所以很多C++中的类型不知道怎么去定义,希望大家能帮帮忙!谢谢。结构体在C++中的定义如下所示:
typedef struct TH_PlateIDResult 
{
char license[16];
char color[8];
int nColor; // 车牌颜色
int nType; // 车牌类型
int nConfidence; // 整牌可信度
int nBright; // 亮度评价
int nDirection; //车牌运动方向,0 unknown, 1 left, 2 right, 3 up , 4 down

TH_RECT rcLocation;
const unsigned char *pbyBits; /* 该识别结果对应的图片的缓冲区, 只有当 bOutputSingleFrame = true 时,该指针才有效。
下次识别后,该缓冲区内容被覆盖。调用程序无需释放该缓冲区。
缓冲区大小等于传递进来的图片数据的长度*/
int nTime;
unsigned char nCarBright; //车的亮度
unsigned char nCarColor; //车的颜色
char reserved[100]; // 保留
}TH_PlateIDResult;

函数在C++中的声明:

int __stdcall TH_RecogImage(const unsigned char *pbyBits, int nWidth, int nHeight, TH_PlateIDResult *pResult,
int *nResultNum, const TH_RECT *prcRange, TH_PlateIDCfg *pPlateConfig);

------解决方案--------------------
首先对TH_RECT这个结构体声明,楼主没有贴出来,MSDN是这样:
typedef struct _RECT { 
LONG left; 
LONG top; 
LONG right; 
LONG bottom; 
} RECT; 

估计成员是一样,只是名称不同而已!
C# code

[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
public struct RECT{
  public int left; 
  public int top; 
  public int right; 
  public int bottom; 
}

[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
public struct TH_PlateIDResult{
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
   public string license;
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
   public string color;
   public int nColor; // 车牌颜色
   public int nType; // 车牌类型
   public int nConfidence; // 整牌可信度
   public int int nBright; // 亮度评价
   public int int nDirection; //车牌运动方向,0 unknown, 1 left, 2 right, 3 up , 4 down

   public RECT rcLocation;
   public IntPtr pbyBits;
   public int nTime;
   public  byte nCarBright; //车的亮度
   public  byte nCarColor; //车的颜色

   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
   public  string reserved; // 保留
}

  [ DllImport( "test.dll" ,CharSet = CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
  public static extern int TH_RecogImage(IntPtr pbyBits, int nWidth, int nHeight, ref TH_PlateIDResult  pResult,ref int nResultNum, ref RECT prcRange, ref TH_PlateIDCfg pPlateConfig);