public static IntPtr MarshalManagedToNative(ArrayDescMarshal arrayDesc, ArrayBoundMarshal[] arrayBounds)
        {
            int    size = ArrayDescMarshal.ComputeLength(arrayBounds.Length);
            IntPtr ptr  = Marshal.AllocHGlobal(size);

            Marshal.StructureToPtr(arrayDesc, ptr, true);
            for (int i = 0; i < arrayBounds.Length; i++)
            {
                Marshal.StructureToPtr(arrayBounds[i], ptr + ArrayDescMarshal.ComputeLength(i), true);
            }

            return(ptr);
        }
示例#2
0
        public static void CleanUpNativeData(ref IntPtr pNativeData)
        {
            if (pNativeData != IntPtr.Zero)
            {
                Marshal.DestroyStructure <ArrayDescMarshal>(pNativeData);

                for (var i = 0; i < 16; i++)
                {
                    Marshal.DestroyStructure <ArrayBoundMarshal>(pNativeData + ArrayDescMarshal.ComputeLength(i));
                }

                Marshal.FreeHGlobal(pNativeData);

                pNativeData = IntPtr.Zero;
            }
        }
        public static void CleanUpNativeData(ref IntPtr pNativeData)
        {
            if (pNativeData != IntPtr.Zero)
            {
                // Destroy ArrayDescMarshal	structure
                Marshal2.DestroyStructure <ArrayDescMarshal>(pNativeData);

                // Destroy ArrayBound structures
                for (int i = 0; i < 16; i++)
                {
                    Marshal2.DestroyStructure <ArrayBoundMarshal>(pNativeData + ArrayDescMarshal.ComputeLength(i));
                }

                // Free	pointer	memory
                Marshal.FreeHGlobal(pNativeData);

                pNativeData = IntPtr.Zero;
            }
        }
        public static IntPtr MarshalManagedToNative(ArrayDesc descriptor)
        {
            ArrayDescMarshal arrayDesc = new ArrayDescMarshal();

            arrayDesc.DataType     = descriptor.DataType;
            arrayDesc.Scale        = (byte)descriptor.Scale;
            arrayDesc.Length       = descriptor.Length;
            arrayDesc.FieldName    = descriptor.FieldName;
            arrayDesc.RelationName = descriptor.RelationName;
            arrayDesc.Dimensions   = descriptor.Dimensions;
            arrayDesc.Flags        = descriptor.Flags;

            ArrayBoundMarshal[] arrayBounds = new ArrayBoundMarshal[descriptor.Bounds.Length];

            for (int i = 0; i < descriptor.Dimensions; i++)
            {
                arrayBounds[i].LowerBound = (short)descriptor.Bounds[i].LowerBound;
                arrayBounds[i].UpperBound = (short)descriptor.Bounds[i].UpperBound;
            }

            return(MarshalManagedToNative(arrayDesc, arrayBounds));
        }