在c#中将结构转换为char指针

本文关键字:char 指针 转换 结构 | 更新日期: 2023-09-27 18:07:04

下面这段代码是用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++中那样div ?

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

发生的事情是,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#版本时需要帮助吗?

在c#中将结构转换为char指针