四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3048|回复: 2
打印 上一主题 下一主题

C# 的内存拷贝

[复制链接]
  • TA的每日心情
    开心
    2018-11-9 08:52
  • 241

    主题

    691

    帖子

    7652

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    7652
    跳转到指定楼层
    楼主
    发表于 2017-3-24 09:54:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    近段时间在C#是直接调用动态库比较多,由于有时又需要使用ActiveX控件,往往出现很多的同名的不同命名空间的类,结构等,对不同实体之类的转换是很烦的一件事,于是考虑到内存直接拷贝。

        /// <summary>
        /// 内存复制。
        /// </summary>
        public static class StructCopyer
        {
            //        相当于序列化与反序列化,但是不用借助外部文件
            //1、struct转换为Byte[]
            public static Byte[] StructToBytes(Object structure)
            {
                Int32 size = Marshal.SizeOf(structure);
                IntPtr buffer = Marshal.AllocHGlobal(size);

                try
                {
                    Marshal.StructureToPtr(structure, buffer, false);
                    Byte[] bytes = new Byte[size];
                    Marshal.Copy(buffer, bytes, 0, size);

                    return bytes;
                }
                finally
                {
                    Marshal.FreeHGlobal(buffer);
                }

            }

            //2、Byte[]转换为struct
            public static Object BytesToStruct(Byte[] bytes, Type strcutType)
            {
                Int32 size = Marshal.SizeOf(strcutType);
                IntPtr buffer = Marshal.AllocHGlobal(size);

                try
                {
                    Marshal.Copy(bytes, 0, buffer, size);

                    return Marshal.PtrToStructure(buffer, strcutType);
                }
                finally
                {
                    Marshal.FreeHGlobal(buffer);
                }
            }

        }



    注:此处的类或结构必须是顺序和长度都相同。可以参考    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
  • TA的每日心情
    开心
    2018-11-9 08:52
  • 241

    主题

    691

    帖子

    7652

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    7652
    沙发
     楼主| 发表于 2017-3-24 10:00:36 | 只看该作者
    //3.

    byte[] newm = new byte[retVal];
    int t = 1234;
    GCHandle h = GCHandle.Alloc(t, GCHandleType.Pinned);
    IntPtr p = h.AddrOfPinnedObject();
    Marshal.Copy(p, newm, 0, retVal);
  • TA的每日心情
    开心
    2018-11-9 08:52
  • 241

    主题

    691

    帖子

    7652

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    7652
    板凳
     楼主| 发表于 2017-3-24 10:03:18 | 只看该作者
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-4-28 11:46 , Processed in 1.078125 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表