public static ItemPropertyId[] ReadItemPropertyIds(int size, IntPtr dataPtr, IntPtr errorsPtr)
        {
            try
            {
                var results = new ItemPropertyId[size];
                for (var i = 0; i < size; i++)
                {
                    var idPtr = Marshal.ReadIntPtr(dataPtr, i * IntPtr.Size);
                    results[i].Id    = Marshal.PtrToStringUni(idPtr);
                    results[i].Error = Marshal.ReadInt32(errorsPtr, i * sizeof(int));

                    Marshal.FreeCoTaskMem(idPtr);
                }

                return(results);
            }
            finally
            {
                if (dataPtr != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(dataPtr);
                }
                if (errorsPtr != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(errorsPtr);
                }
            }
        }
        public static ItemPropertyId[] ReadItemPropertyIds(int size, IntPtr dataPtr, IntPtr errorsPtr)
        {
            try
            {
                var results = new ItemPropertyId[size];
                for (var i = 0; i < size; i++)
                {
                    var idPtr = Marshal.ReadIntPtr(dataPtr, i * IntPtr.Size);
                    results[i].Id = Marshal.PtrToStringUni(idPtr);
                    results[i].Error = Marshal.ReadInt32(errorsPtr, i * sizeof(int));

                    Marshal.FreeCoTaskMem(idPtr);
                }

                return results;
            }
            finally
            {
                if (dataPtr != IntPtr.Zero)
                    Marshal.FreeCoTaskMem(dataPtr);
                if (errorsPtr != IntPtr.Zero)
                    Marshal.FreeCoTaskMem(errorsPtr);
            }        
        }