Пользовательский 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 не производит выходной двоичный файл. Для этого может быть несколько причин. Как правило, процесс завершился сбоем, и журналы сборки дадут немного больше подробностей, почему.
Еще более важным является прикрепление отдельного контрольного примера к отчету об ошибке. Что-то еще, кроме вставленного вами кода, может играть важную роль, которая привела к сбою (и может быть невозможно продублировать или угадать, какой может быть эта часть). Это также дает нам больше шансов предложить решение этой проблемы.