zoukankan      html  css  js  c++  java
  • C# 的内存拷贝

    近段时间在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)]

  • 相关阅读:
    fixed固定定位实现可拖拽
    描述windows和linux如何抓取数据报文
    Javascript基础系列(七)-BOM
    Javascript基础系列(六)-函数
    Javascript基础系列(五)-面向对象
    浅述数组排序
    Android 相对布局 RelativeLayout
    Android 框架布局 FrameLayout
    Android 线性布局 计算器
    Android 线性布局 LinearLayout
  • 原文地址:https://www.cnblogs.com/Yjianyong/p/1792976.html
Copyright © 2011-2022 走看看