下面是用c ++编写的代码片段,如何在c#中进行转换。如果检查pams_get_msgw函数,第一个参数是(char *),我怎么能在c#中传递它。
struct
{
short m_nStatus;
short m_nReg_Id;
short m_nNumber_Reg;
} oRegReply;
short nBufSize = sizeof(oRegReply);
q_address oSenderQueue;
nMsgType = MSG_TYPE_SBS_REG_REPLY;
cPriority = 0;
lTimeout = 300; // 30 seconds
//Wait for reply telegram from SBS server
lStatus = pams_get_msgw((char *) &oRegReply, &cPriority, &oSenderQueue,
&nMsgClass, &nMsgType, &nBufSize, &nMsgLen,
&lTimeout, NULL, NULL, NULL, NULL,
NULL, NULL, NULL);
我对 pams_get_msgw 函数的c#声明是这样的
[DllImport("DmqCl32.dll")]
public static extern int pams_get_msgw(StringBuilder msg_area, string priority, out q_address source,
out short clas, out short type,
ref short msg_area_len, out short len_data, ref int timeout,
ref int sel_filter, out PSB psb, out ShowBuffer show_buffer,
ref int show_buffer_len, ref int large_area_len, out int large_size,
[MarshalAs(UnmanagedType.LPStr)] string nullarg_3);
和实际的c ++声明
typedef long (CALLBACK* PAMSGETMSGW)(char *,char *,q_address *, short *, short *, short *,
short *, long *, long *, struct PSB *,
struct show_buffer *, long *, char *, char *, char * );
如何将结构传递给第一个参数,就像在c ++中一样 ?
答案 0 :(得分:2)
您应该能够在C#中将结构声明为类而不是结构,然后您可以通过P / Invoke传递它而不使用ref
关键字。< / p>
正在发生的事情是,C代码非常古老,以至于它使用了char*
,它应该使用byte*
。
无论如何,对于大多数情况,P / Invoke的默认编组处理固定和传递对象引用,因此如果您只传递一个类对象,它可能会起作用。 (许多C ++结构可以在C#端声明为类,这可以使P / Invoke更容易。)
您没有显示pams_get_msgw()
的C声明,但您似乎还必须使用Marshal.Sizeof(RegReply)
作为msg_area_len
的值(其中RegReply
是您的C#类对于C的oRegReply
结构)。
顺便说一下:在声明oRegReply
结构的C#版本时需要帮助吗?