Ejemplo n.º 1
0
        /// <summary>
        /// Allocates from unmanaged memory to hold a copy of a structure.
        /// </summary>
        /// <typeparam name="T">Type of the structure.</typeparam>
        /// <param name="obj">The object.</param>
        /// <returns>SafeHGlobalHandle object to an native (unmanaged) structure</returns>
        public static SafeHGlobalHandle AllocHGlobalStruct <T>(T obj) where T : struct
        {
            Debug.Assert(typeof(T).StructLayoutAttribute.Value == LayoutKind.Sequential);

            SafeHGlobalHandle result = new SafeHGlobalHandle(Marshal.SizeOf(typeof(T)));

            Marshal.StructureToPtr(obj, result.handle, false);
            return(result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Allocates from unmanaged memory to represent a structure with a
        /// variable length array at the end and marshal these structure
        /// elements. It is the callers responsibility to marshal what precedes
        /// the trailing array into the unmanaged memory. ONLY structures with
        /// attribute StructLayout of LayoutKind.Sequential are supported.
        /// </summary>
        /// <typeparam name="T">Type of the trailing array of structures</typeparam>
        /// <param name="prefixBytes">Number of bytes preceding the trailing array of structures</param>
        /// <param name="values">Collection of structure objects</param>
        /// <param name="count"></param>
        /// <returns>SafeHGlobalHandle object to an native (unmanaged) structure
        /// with a trail array of structures</returns>
        public static SafeHGlobalHandle AllocHGlobal <T>(int prefixBytes, IEnumerable <T> values, int count) where T : struct
        {
            Debug.Assert(typeof(T).StructLayoutAttribute.Value == LayoutKind.Sequential);

            SafeHGlobalHandle result = new SafeHGlobalHandle(prefixBytes + Marshal.SizeOf(typeof(T)) * count);
            IntPtr            ptr    = new IntPtr(result.handle.ToInt32() + prefixBytes);

            foreach (var value in values)
            {
                Marshal.StructureToPtr(value, ptr, false);
                ptr = new IntPtr(ptr.ToInt32() + Marshal.SizeOf(typeof(T)));
            }
            return(result);
        }