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); }
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)); }