2013-03-09 57 views
0

您好,我有這個結構訪問衝突在Marshal.StructureToPtr

[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#導致錯誤!

感謝

回答

1

true參數要求的框架刪除源內存。當然,這個記憶沒有被編組人員分配,所以它沒有成功。請嘗試以下操作來代替:

System.Runtime.InteropServices.Marshal.StructureToPtr(this, ptr, false); 
+0

它帶來了內存泄漏;( – saeed 2013-03-09 15:20:33

+0

我的問題是,我想在網絡中傳輸數據包格式發送數據塊,並在其中的VC++ – saeed 2013-03-09 15:22:10

+0

其他應用程序收到@ saeed你怎麼檢測這個「內存泄漏」? – 2013-03-09 15:37:01