0

下面是用 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++ 中所做的那样?

4

1 回答 1

2

您应该能够在 C# 中将您的结构声明为而不是结构,然后您可以通过 P/Invoke 传递它而不使用ref关键字。

发生的事情是 C 代码太古老了,以至于它char*在应该使用byte*.

无论如何,P/Invoke 的默认封送处理在大多数情况下处理固定和传递对象引用,因此如果您只传递一个类对象,它可能会起作用。(许多 C++ 结构可以在 C# 端声明为类,这可以使 P/Invoke 更容易。)

您没有显示 C 声明,pams_get_msgw()但看起来您还必须使用Marshal.Sizeof(RegReply)for 的值msg_area_lenRegReplyC 结构的 C# 类在哪里oRegReply)。

顺便说一句:您在声明oRegReply结构的 C# 版本时需要帮助吗?

于 2013-04-01T09:07:58.570 回答