Marshal.PtrToStructure和String的问题

时间:2011-01-24 15:08:42

标签: c# string marshalling structlayout

我有以下课程

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public class xy11Dataset : SZLDataset
{
    public short Index { get; set; }

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
    private string _mlfB;
    public string MlfB
    {
        get { return _mlfB; }
        set { _mlfB = value; }
    }

    public UInt16 BGTyp { get; set; }

    public UInt16 Ausbg1 { get; set; }

    public UInt16 Ausbg2 { get; set; }
}

我填写以下代码:

byte[] objBuffer = new byte[retVal.Size];
Array.Copy(buffer, (n*retVal.Size) + 8, objBuffer, 0, retVal.Size);
GCHandle handle = GCHandle.Alloc(objBuffer, GCHandleType.Pinned);
datsets.Add((xy11Dataset)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(xy11Dataset)));
handle.Free();

我在位置2的objBuffer中有值(这应该是字符串的开头),但字符串保持为空!

1 个答案:

答案 0 :(得分:3)

您需要放弃使用自动属性。它们生成一个私有支持字段,该字段与该属性顺序,它被添加到最后。您可以使用ildasm.exe查看它们,它们的名称类似于<Index>k_Backingfield。您需要使此表达式返回正确的值:

        int offs = (int)Marshal.OffsetOf(typeof(xy11Dataset), "_mlfB");

我看不到SZLDataSet包含的内容,但没有它,现在返回0。不正确,你想要2.最好的办法是声明一个带有公共字段的结构,其布局与缓冲区中的数据完全匹配。从值初始化类对象。