C#指针:错误CS0254:固定语句赋值的右侧可能不是强制转换表达式 我有一个C++服务器,现在尝试制作一个C客户端。 在C++中,发送一个包,我这样做: PMessage *msg = (PMessage*)&buf[0]; msg->id = PID_LOGIN; sendto(sServer, buf, sizeof(buf), 0, (SOCKADDR*)&from, fromlen);

C#指针:错误CS0254:固定语句赋值的右侧可能不是强制转换表达式 我有一个C++服务器,现在尝试制作一个C客户端。 在C++中,发送一个包,我这样做: PMessage *msg = (PMessage*)&buf[0]; msg->id = PID_LOGIN; sendto(sServer, buf, sizeof(buf), 0, (SOCKADDR*)&from, fromlen);,c#,c++,C#,C++,在c#中,我尝试这样做: unsafe { try { byte[] rawdata = new byte[Marshal.SizeOf(typeof(PMessage))]; fixed (PMessage* p = (PMessage*)&rawdata[0]) { // p->id = 1001; } udpClient.Send(rawdata, ra

在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#:

c++:

试试这个:

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
)环境混合使用。

您不能这样做,因为编译器无法跟踪需要固定的对象

fixed (PMessage* p = (PMessage*)&rawdata[0])
然而,这应该是可行的

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

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

编译器错误非常清楚,实际上这里还没有提出问题。我不知道还有其他方法来做这件事,所以我来帮助你,就像C++程序员一样,它不太健康。改用BinaryWriter。或者是一种更好的有线协议,它不太依赖于字节顺序和类型大小等细节,protobuf很受欢迎。您可以先获取字节*,然后将其强制转换为PMessage*,从而获得所需的内容。
fixed (PMessage* p = (PMessage*)&rawdata[0])
fixed (byte* pby = &rawdata[0]) {
    PMessage* p = (PMessage*)pby;