/// <summary> /// If the specified <code>IBuffer</code> is backed by a managed array, this method will return <code>true</code> and /// set <code>underlyingDataArray</code> to refer to that array /// and <code>underlyingDataArrayStartOffset</code> to the value at which the buffer data begins in that array. /// If the specified <code>IBuffer</code> is <em>not</em> backed by a managed array, this method will return <code>false</code>. /// This method is required by managed APIs that wish to use the buffer's data with other managed APIs that use /// arrays without a need for a memory copy. /// </summary> /// <param name="buffer">An <code>IBuffer</code>.</param> /// <param name="underlyingDataArray">Will be set to the data array backing <code>buffer</code> or to <code>null</code>.</param> /// <param name="underlyingDataArrayStartOffset">Will be set to the start offset of the buffer data in the backing array /// or to <code>-1</code>.</param> /// <returns>Whether the <code>IBuffer</code> is backed by a managed byte array.</returns> internal static bool TryGetUnderlyingData(this IBuffer buffer, out byte[] underlyingDataArray, out int underlyingDataArrayStartOffset) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } WindowsRuntimeBuffer winRtBuffer = buffer as WindowsRuntimeBuffer; if (winRtBuffer == null) { underlyingDataArray = null; underlyingDataArrayStartOffset = -1; return(false); } winRtBuffer.GetUnderlyingData(out underlyingDataArray, out underlyingDataArrayStartOffset); return(true); }
/// <summary> /// If the specified <code>IBuffer</code> is backed by a managed array, this method will return <code>true</code> and /// set <code>underlyingDataArray</code> to refer to that array /// and <code>underlyingDataArrayStartOffset</code> to the value at which the buffer data begins in that array. /// If the specified <code>IBuffer</code> is <em>not</em> backed by a managed array, this method will return <code>false</code>. /// This method is required by managed APIs that wish to use the buffer's data with other managed APIs that use /// arrays without a need for a memory copy. /// </summary> /// <param name="buffer">An <code>IBuffer</code>.</param> /// <param name="underlyingDataArray">Will be set to the data array backing <code>buffer</code> or to <code>null</code>.</param> /// <param name="underlyingDataArrayStartOffset">Will be set to the start offset of the buffer data in the backing array /// or to <code>-1</code>.</param> /// <returns>Whether the <code>IBuffer</code> is backed by a managed byte array.</returns> internal static bool TryGetUnderlyingData(this IBuffer buffer, out Byte[] underlyingDataArray, out Int32 underlyingDataArrayStartOffset) { if (buffer == null) { throw new ArgumentNullException("buffer"); } Contract.EndContractBlock(); WindowsRuntimeBuffer winRtBuffer = buffer as WindowsRuntimeBuffer; if (winRtBuffer == null) { underlyingDataArray = null; underlyingDataArrayStartOffset = -1; return(false); } winRtBuffer.GetUnderlyingData(out underlyingDataArray, out underlyingDataArrayStartOffset); return(true); }