我有一个c++服务器,现在正在尝试制作一个C#客户端。

在c++中,要发送数据包,请执行以下操作:

PMessage *msg = (PMessage*)&buf[0];
msg->id = PID_LOGIN;
sendto(sServer, buf, sizeof(buf), 0, (SOCKADDR*)&from, fromlen);

在C#中我尝试这样做:
unsafe
{
    try
    {
        byte[] rawdata = new byte[Marshal.SizeOf(typeof(PMessage))];

        fixed (PMessage* p = (PMessage*)&rawdata[0])
        {

        //     p->id = 1001;
        }
        udpClient.Send(rawdata, rawdata.Length); ;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

编译器显示此错误:



C#:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
 unsafe struct PMessage
{
    public  fixed byte msg[256];
    public int id;
    public int size;
}

C++:
   struct PMessage
    {
        char msg[256];
        unsigned int id;
        unsigned int size;
    };

最佳答案

您无法执行此操作,因为编译器无法跟踪需要固定哪个对象。

fixed (PMessage* p = (PMessage*)&rawdata[0])

但是,这应该工作
fixed (byte* pby = &rawdata[0]) {
    PMessage* p = (PMessage*)pby;

请注意,您的C++代码可能违反了严格的别名,并且C++和C#可能没有正确的对齐方式。

09-25 18:19