簡體   English   中英

C#指針:錯誤CS0254:固定語句賦值的右側可能不是強制轉換表達式

[英]C# Pointer: error CS0254: The right hand side of a fixed statement assignment may not be a cast expression

我有一個c ++服務器,現在正在嘗試制作ac#客戶端。

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

嘗試這個:

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#可能沒有正確的對齊方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM