2012-05-31 33 views
5

Tôi có một struct ++ C dưới đây:Chuyển đổi C++ struct C#

struct CUSTOM_DATA { 
    int id; 
    u_short port; 
    unsigned long ip; 
} custom_data; 

Làm thế nào tôi có thể chuyển nó sang C# struct, serialize nó và gửi thông qua ổ cắm tcp?

Cảm ơn!

UPD

Vì vậy, mã C# sẽ là?

[StructLayout(LayoutKind.Sequential)] 
public struct CustomData 
{ 
public int id; 
public ushort port; 
public uint ip; 
} 

public void Send() 
{ 
CustomData d = new CustomData(); 
d.id = 12; 
d.port = 1000; 
d.ip = BitConverter.ToUInt32(IPAddress.Any.GetAddressBytes(), 0); 
IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf(d)); 
Marshal.StructureToPtr(d, pointer, false); 
byte[] data_to_send = new byte[Marshal.SizeOf(d)]; 
Marshal.Copy(pointer, data_to_send, 0, data_to_send.Length); 
client.GetStream().Write(data_to_send, 0, data_to_send.Length); 
} 

Trả lời

9

C# phiên bản của struct này sẽ là:

[StructLayout(LayoutKind.Sequential)] 
public struct CustomData 
{ 
    public int id; 
    public ushort port; 
    public uint ip; 
} 

Đối với gửi tin nhắn này thông qua một ổ cắm, bạn chỉ có thể gửi dữ liệu nhị phân trực tiếp. Các Marshal class có phương pháp để nhận được một con trỏ (IntPtr) từ cấu trúc và sao chép vào một mảng byte.

+0

Cám ơn câu trả lời của bạn, bạn có thể giúp tôi, là tất cả ok với mã của tôi về việc sao chép để đệm và gửi nó? – Becker

+0

@Becker Bạn nên sử dụng StructureToPtr, không phải GetComInterfaceForObject. Xem: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.structuretoptr.aspx#Y1000 –

+0

Cảm ơn! Xin lỗi, tôi chưa bao giờ làm những việc như thế này trước đây. Tôi chỉnh sửa mã của tôi, bây giờ tất cả ok? – Becker

1
[StructLayout(LayoutKind.Sequential)] 
struct CUSTOM_DATA { 
    int id; 
    ushort port; 
    uint ip; 
}; 
CUSTOM_DATA cData ; // use me 

chỉnh sửa: thx sậy

+3

Nó phải là uint, không phải ulong - Một C++ "unsigned long" là 4 byte, tức là: UInt32 trong C# –