日期:2014-05-17  浏览次数:21335 次

C#调用VC++写的DLL时报错:无效的托管/非托管类型组合(Int16/UInt16 必须与 I2 或 U2 成对出现)
函数原型: unsigned short GX_GetMessageForWindows(
unsigned short WaitTime,PGX_MESSAGE_INFO pMessageBuffer)
功 能: 获取USB语音盒的事件
参 数: WaitTime 无意义,保留
pMessageBuffer 指向GX_MESSAGE_INFO结构的地址指针,用于存放返回的事件,GX_MESSAGE_INFO的结构定义如下:
typedef struct _GX_MESSAGE_INFO
{
USHORT MessageCode;
USHORT ChannelNo;
USHORT Parameter[6];
} GX_MESSAGE_INFO, *PGX_MESSAGE_INFO;
如果该函数返回0,则表示有事件发生,事件类型以及其它指
示存于上面结构中。
上面是是函数原型
=======================================================
[DllImport("GxUsb.dll")]
public extern static short GX_GetFskCallerID(short ChannelNo, StringBuilder SDateTime, StringBuilder TelNo, StringBuilder Name);
这是C#调用定义
=======================================================
/// <summary>
/// 存放返回事件结构类
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct GX_MESSAGE_INFO
{
  public ushort MessageCode;
  public UInt16 ChannelNo;
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
  public UInt16 Parameter;
  //public int[] Parameter;
}
这是C#中定义的返回事件的结构
====================================================
在进行函数调用时总是报错:无法封送处理类型为“GX_MESSAGE_INFO”的字段“Parameter”: 无效的托管/非托管类型组合(Int16/UInt16 必须与 I2 或 U2 成对出现)。
其中结构中各字段类型我已经试过int,ushort,uint16,uint类型


------解决方案--------------------
C# code

[StructLayout(LayoutKind.Sequential)] 
public struct GX_MESSAGE_INFO 
{ 
  public ushort MessageCode; 
  public ushort ChannelNo; 
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] 
  public ushort[] Parameter; 
}

static extern ushort GX_GetMessageForWindows( ushortWaitTime, ref GX_MESSAGE_INFO pMessageBuffer );