繁体   English   中英

C# 中的编组结构

[英]marshaling structure in C#

我有这段代码,它会产生一个错误:

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct MyItem
    {
        [MarshalAs(UnmanagedType.LPWStr)]
        public string Name;
        public int ID;
        public double ID1;

    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {

        MyItem[] items = new MyItem[6];
        items[0].Name = "JFK";
        items[0].ID = 35;
        items[1].Name = "LBJ";
        items[1].ID = 36;
        items[2].Name = "Tricky Dicky";
        items[2].ID = 37;
        items[3].Name = "Gerald Ford";
        items[3].ID = 38;
        items[4].Name = "Jimmy Carter";
        items[4].ID = 39;
        items[5].Name = "Ronald Reagan";
        items[5].ID = 40;

        IntPtr itemsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MyItem)) * 
           items.Length);
        try
        {
            IntPtr item = new IntPtr(itemsPtr.ToInt32());
            for (int i = 0; i < items.Length; i++)
            {
                Marshal.StructureToPtr(items[i], item, true);
                item = new IntPtr(item.ToInt32() + Marshal.SizeOf(typeof(MyItem)));
            }         
        }
        finally
        {
            Marshal.FreeHGlobal(itemsPtr);
        }

当我运行此代码时,我write protection error in Marshal.StructureToPtr(items[i], item, true);

有什么问题,我该如何解决?

您应该将false传递给StructureToPtr()fDeleteOld参数。

通过传递true您要求编组器删除item的内容。 由于您是第一次填写此内容,因此会导致 memory 访问失败,因为 memory 尚未生效。

该文档指出:

StructureToPtr 将结构的内容复制到 ptr 参数指向的 memory 的预分配块中。 如果 fDeleteOld 参数为真,则使用嵌入指针上的适当删除方法删除预分配的缓冲区,但缓冲区必须包含有效数据

重点是我的。

顺便说一句,我认为循环代码看起来更整洁:

Int32 addr = itemsPtr.ToInt32();
for (int i = 0; i < items.Length; i++)
{
    Marshal.StructureToPtr(items[i], new IntPtr(addr), false);
    addr += Marshal.SizeOf(typeof(MyItem));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM