大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > 进程间通信的一个方法

进程间通信的一个方法(2)

关键词:进程间通信  阅读(1419) 赞(50)

[摘要]本文介绍了进程间通信的一个方法,一起学习。

    //根据需要扩展该结构体
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
    public struct MyData
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
        public char[] c0;
        public int l0;

        public int i0;
        public int i1;
        public int i2;
        public int i3;
        public int i4;
        public int i5;

        //placeholder:该参数我用不着,可C#规定必需有,所以起个这名字
        public MyData(int placeholder)
        {
            c0 = new char[1024];
            l0 = 0;     
            i0 = 0;
            i1 = 0;
            i2 = 0;
            i3 = 0;
            i4 = 0;
            i5 = 0;
        }//end fun

        /// <summary>
        /// 进程间通信,进程ID,-2表示所有进程
        /// </summary>
        public int ProcessID
        {
            get
            { return i4; }
            set
            {

                i4 = value;
            }
        }

        /// <summary>
        /// 进程间通信,消息码
        /// </summary>
        public int InfoCode
        {
            get
            { return i5; }
            set
            { i5 = value; }
        }

        /// <summary>
        /// 示例字符串参数
        /// </summary>
        public string Url
        {
            get
            {
                if (l0 > 0)
                { return new string(c0, 0, l0); }
                else
                {
                    return "";
                }
            }
            set
            {
                if (value != null)
                {
                    value.CopyTo(0, c0, 0, value.Length);
                    l0 = value.Length;
                }
            }
        }

        /// <summary>
        /// 示例矩形参数
        /// </summary>
        public Rectangle WindowPosition
        {
            get
            { return new Rectangle(i0, i1, i2, i3); }
            set
            {
                i0 = value.X;
                i1 = value.Y;
                i2 = value.Width;
                i3 = value.Height;
            }
        }
    }//end struct


    public static class Tools
    {
        //序列化结构体复制入byte数组
        public static byte[] StructToBytes(object structObj)
        {
            //得到结构体的大小
            int size = Marshal.SizeOf(structObj);
            //创建byte数组
            byte[] bytes = new byte[size];
            //分配结构体大小的内存空间
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将结构体拷到分配好的内存空间
            Marshal.StructureToPtr(structObj, structPtr, false);
            //从内存空间拷到byte数组
            Marshal.Copy(structPtr, bytes, 0, size);
            //释放内存空间
            Marshal.FreeHGlobal(structPtr);
            //返回byte数组
            return bytes;
        }

        //byte数组复制入序列化结构体,注意在返回结果前加上强制转换
        public static object BytesToStuct(byte[] bytes, Type type)
        {
            //得到结构体的大小
            int size = Marshal.SizeOf(type);
            //byte数组长度小于结构体的大小
            if (size > bytes.Length)
            {
                //返回空
                return null;
            }
            //分配结构体大小的内存空间
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将byte数组拷到分配好的内存空间
            Marshal.Copy(bytes, 0, structPtr, size);
            //将内存空间转换为目标结构体
            object obj = Marshal.PtrToStructure(structPtr, type);
            //释放内存空间
            Marshal.FreeHGlobal(structPtr);
            //返回结构体
            return obj;
        }//end fun
    }//end class

«上一页12下一页»


相关评论