Пользовательский HttpContent не будет собираться - не удалось AOT сборка (mtouch)

В моих усилиях по созданию индикатора прогресса для загрузки видео с использованием HttpClient (SendAsync) в формах Xamarin, теперь мне нужно обратиться за помощью.

Сама загрузка работает нормально, и все другие вызовы API, но когда я пытаюсь создать пользовательский HttpContent чтобы отслеживать процесс загрузки, проект больше не будет создаваться.

Ошибка MT3001: Не удалось AOT сборки "[...]. IOS/obj/iPhone/Debug/build-iphone7.2-10.1.1/mtouch-cache/Build/theproject.dll" (MT3001) (theproject.iOS)

Используя вместо этого StreamContent или ByteArrayContent, проект строится, но я не могу заставить его работать, чтобы отслеживать прогресс.

Фрагмент кода (это минимальный пример):

public class ProgressableContent : HttpContent
{
    private const int defaultBufferSize = 4096;
    private Stream content;
    private int progress;

    public ProgressableContent(Stream content)
    {
        this.content = content;
    }

    protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
    {
        return Task.Run(async () =>
        {
            var buffer = new byte[defaultBufferSize];
            var size = content.Length;
            var uploaded = 0;

            using (content) while (true)
            {
                var length = content.Read(buffer, 0, buffer.Length);
                if (length <= 0) break;

                uploaded += length;
                progress = (int)((float)uploaded / size * 100);

                await stream.WriteAsync(buffer, 0, length);
            }
        });
    }

    protected override bool TryComputeLength(out long length)
    {
        length = content.Length;
        return true;
    }
}

Я использую это, преобразовывая мои байты в поток, надеюсь, правильно:

//... building httpMessage.
httpMessage.Content = new ProgressableContent(await byteArrayContent.ReadAsStreamAsync());
//...
var response = await _httpClient.SendAsync(httpMessage, Cancellation.Token);
//...

Вопрос (ы): я как-то вызываю ошибку? Есть лучший способ сделать это?

Пометил это Xamarin.iOS также, поскольку monotouch жалуется.

1 ответ

Решение

Дважды щелкните на ошибке из XS, и она откроет вам веб-страницу, которая предоставит более подробное описание проблемы. Например

MT3001 Не удалось AOT сборки "*"

Обычно это указывает на ошибку в компиляторе AOT. Пожалуйста, отправьте сообщение об ошибке http://bugzilla.xamarin.com/ в проект, который можно использовать для воспроизведения ошибки.

Иногда это можно обойти, отключив инкрементные сборки в опции сборки iOS проекта (но это все еще ошибка, поэтому, пожалуйста, сообщите об этом в любом случае).

Главное о 3001 является то, что компилятор AOT не производит выходной двоичный файл. Для этого может быть несколько причин. Как правило, процесс завершился сбоем, и журналы сборки дадут немного больше подробностей, почему.

Еще более важным является прикрепление отдельного контрольного примера к отчету об ошибке. Что-то еще, кроме вставленного вами кода, может играть важную роль, которая привела к сбою (и может быть невозможно продублировать или угадать, какой может быть эта часть). Это также дает нам больше шансов предложить решение этой проблемы.

Другие вопросы по тегам