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 );