C#指针:错误CS0254:固定语句赋值的右侧可能不是强制转换表达式

时间:2015-03-28 23:27:24

标签: c# c++

我有一个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());
    }
}

编译器显示此错误:

  

错误CS0254:固定语句赋值的右侧可能不是强制转换表达式。

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;
    };

2 个答案:

答案 0 :(得分:1)

试试这个:

PMessage p = new PMessage();
// p.id = 1001;
byte[] rawdata = new byte[Marshal.SizeOf(typeof(PMessage))];
IntPtr mem = Marshal.AllocHGlobal(rawdata.Length);
try{
    Marshal.StructureToPtr(p, mem, true);
    Marshal.Copy(mem, rawdata, 0, rawdata.Length);
}finally{
    Marshal.FreeHGlobal(mem);
}
udpClient.Send(rawdata, rawdata.Length);

也不要混合不安全(fixed)和非托管(SizeOf)环境。

答案 1 :(得分:0)

你不能这样做,因为编译器会忘记需要固定哪个对象。

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

然而,这应该有效

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

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