0

こんにちは、私はこの構造体を持っています

 [StructLayout (LayoutKind.Sequential)]
 public struct Transfer_packet 
        {
            public int  _packet_type; // 0 is action 1 is data
            public int _packet_len; // length of data
            public byte[] _data;//;= new byte[DataLenght];
            public void fill()
            {

            }
            public byte[] deserialize()
            {
                int size = System.Runtime.InteropServices.Marshal.SizeOf(this);
                byte[] arr = new byte[size];
                IntPtr ptr = System.Runtime.InteropServices.Marshal.AllocHGlobal(size);
                System.Runtime.InteropServices.Marshal.StructureToPtr(this, ptr, true);  // error raised
                System.Runtime.InteropServices.Marshal.Copy(ptr,arr,0,size);
                System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr);
                return arr;
            }
        }

これをネットワーク経由で送信し、別のコンピューターで取得するために、構造体のコンテンツをバイト配列に変換しようとしていますが、コード (上記) でエラーが発生しました:

保護されたメモリを読み書きしようとしました。

これは多くの場合、一部のメモリが破損していることを示しています。理由はわかりません。私にはすべて問題ないように見えますが、マーシャルは保護されたメモリにアクセスしようとしています...

構造体インスタンスをバイト配列に変換するにはどうすればよいですか? 私はC ++で簡単に完全にそれを行いましたmemcpyが、C#ではできません。

4

1 に答える 1

1

このtrueパラメーターは、ソース メモリを削除するようフレームワークに要求しています。もちろん、このメモリはマーシャラーによって割り当てられたものではないため、失敗しています。代わりに次のことを試してください。

System.Runtime.InteropServices.Marshal.StructureToPtr(this, ptr, false);
于 2013-03-09T14:53:30.573 に答える