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

时间:2013-04-01 09:02:17

标签: c# c++ c#-4.0 c#-3.0 c#-2.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 ++中一样 ?

1 个答案:

答案 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#版本时需要帮助吗?

相关问题