0

以下は、C++ で記述されたコードの一部です。C# で変換するにはどうすればよいですか。pams_get_msgw function を確認すると、最初のパラメーターは (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# で構造体を構造体ではなくクラスとして宣言できるはずです。その後、refキーワードを使用せずに P/Invoke 経由で渡すことができます。

何が起こっているかというと、C コードが非常に古いため、 をchar*使用すべき場所で を使用しているということbyte*です。

とにかく、P/Invoke の既定のマーシャリングは、ほとんどの場合にオブジェクト参照の固定と受け渡しを処理するため、クラス オブジェクトを渡すだけで機能する可能性があります。(多くの C++ 構造体は、C# 側でクラスとして宣言できるため、P/Invoke が簡単になります。)

forのC宣言は表示されていませんが、forの値pams_get_msgw()も使用する必要があるようです( Cの構造体のC#クラスはどこですか)。Marshal.Sizeof(RegReply)msg_area_lenRegReplyoRegReply

ところで: 構造体の C# バージョンの宣言についてサポートが必要oRegReplyですか?

于 2013-04-01T09:07:58.570 に答える