marshal.PtrToStructure访问冲突异常

时间:2013-11-25 08:40:27

标签: c# exception marshalling

我有一个定义为

的结构
[StructLayout(LayoutKind.Sequential,Pack=1)]
    private struct networkMessage
        {
        public messageType type;
        public string message;
        }

我有这个函数将结构转换为byte[]

private byte[] ConvertToByteArray(networkMessage inStruct)
        {
        int structSize = Marshal.SizeOf(inStruct);
        byte[] byteArray = new byte[structSize];

        IntPtr memPtr = IntPtr.Zero;

        try
            {
            memPtr = Marshal.AllocHGlobal(structSize);
            Marshal.StructureToPtr(inStruct, memPtr, false);
            Marshal.Copy(memPtr, byteArray, 0, structSize);
            }
        finally
            {
            if (memPtr != IntPtr.Zero)
                {
                Marshal.FreeHGlobal(memPtr);
                }
            }
        foreach (byte b in byteArray)
            {
            Console.WriteLine(b + " ");
            }

        return byteArray;
        }

这将转换回结构

private networkMessage ConvertFromByteArray(byte[] inByte)
        {
        foreach (byte b in inByte)
            {
            Console.WriteLine(b);
            }

        GCHandle handle = GCHandle.Alloc(inByte, GCHandleType.Pinned);

        networkMessage outStruct = (networkMessage) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(networkMessage));  //---Exception here

        return outStruct;
        }

这用于TCP应用程序,它既充当服务器又充当客户端,以便在两台计算机上运行相同的可执行文件。在对象构造函数中测试转换表明它工作正常,但来自另一台计算机的字节数组会导致访问冲突异常。打印出两个系统上的字节表明它们是相同的。可能是什么问题呢?我认为这可能与结构有关吗?

1 个答案:

答案 0 :(得分:1)

这不起作用。

尝试此操作:将message设置为长度超过16个字符的字符串,然后查看Marshal.SizeOf(inStruct)的值。无论message的长度如何,64位版本为12,32位版本为8。

正确的解决方案是使用序列化来转换数据。

您可能需要查看NetTcpBindingDataContracts可以使用JSON serialization来序列化数据。

另外,请查看{{3}}。

相关问题