public AlignedArray(byte[] buffer, int alignment, params int[] lengths) { _buffer = buffer; _alignment = alignment; _length = Utils.GetTotalSize(lengths); _lengths = lengths; if (_length > buffer.Length / Marshal.SizeOf <T>()) { throw new ArgumentException($"Buffer is to small to hold array of size {nameof(lengths)}", nameof(buffer)); } _pin = PinnedGCHandle.Pin(buffer); long value = _pin.Pointer.ToInt64(); int offset = alignment - (int)(value % alignment); _alignedPtr = new IntPtr(value + offset); int maxLength = (_buffer.Length - offset) / Marshal.SizeOf <T>(); if (_length > maxLength) { _pin.Free(); throw new ArgumentException($"Buffer is to small to hold array of size {nameof(lengths)}", nameof(buffer)); } }
public PinnedArray(Array array) { if (array.GetType().GetElementType() != typeof(T)) { throw new ArgumentException($"Must have elements of type {typeof(T).FullName}.", nameof(array)); } _buffer = array; _pin = PinnedGCHandle.Pin(_buffer); }