Ejemplo n.º 1
0
    public static IntPtr MarshalManagedToNative(ArrayDescMarshal arrayDesc, ArrayBoundMarshal[] arrayBounds)
    {
        var size = ArrayDescMarshal.ComputeLength(arrayBounds.Length);
        var ptr  = Marshal.AllocHGlobal(size);

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

        return(ptr);
    }
Ejemplo n.º 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;
        }
    }
Ejemplo n.º 3
0
    public static IntPtr MarshalManagedToNative(ArrayDesc descriptor)
    {
        var 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;

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

        for (var 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));
    }