【问题标题】:Custom HttpContent won't build - Could not AOT the assembly (mtouch)自定义 HttpContent 无法构建 - 无法 AOT 程序集 (mtouch)
【发布时间】:2017-03-25 16:41:00
【问题描述】:

为了在 Xamarin Forms 中使用 HttpClient (SendAsync) 创建用于上传视频的进度指示器,我现在不得不寻求帮助。

上传本身和所有其他 API 调用都可以正常工作,但是当我尝试创建自定义 HttpContent 来跟踪上传进度时,项目甚至不会再构建了。

错误 MT3001:无法 AOT 程序集 '[...].iOS/obj/iPhone/Debug/build-iphone7.2-10.1.1/mtouch-cache/Build/theproject.dll' (MT3001) (theproject.iOS)

使用 StreamContent 或 ByteArrayContent 代替项目构建,但我无法让它跟踪进度。

sn-p 代码(这是最小的示例):

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 一直在抱怨。

【问题讨论】:

  • 您使用的是Xamarin.iOS 的哪个版本?禁用增量构建有帮助吗?查看此问题和相关问题:bugzilla.xamarin.com/show_bug.cgi?id=43689
  • @SushiHangover Xamarin.iOS 版本。 10.2.0.4 (Xamarin Indie),增量构建未启用。

标签: xamarin xamarin.ios xamarin.forms httpcontent


【解决方案1】:

双击来自 XS 的错误,它应该会将您带到一个提供有关该问题的更多描述的网页。例如

MT3001 无法 AOT 程序集“*”

这通常表明 AOT 编译器中存在错误。请提交错误 http://bugzilla.xamarin.com 有一个项目可以用来 重现错误。

有时可以通过禁用增量来解决此问题 在项目的 iOS Build 选项中构建(但它仍然是一个错误,所以 无论如何请报告)。

3001 的主要问题是 AOT 编译器没有生成 输出 二进制文件。这可能有几个原因。通常,该过程崩溃了,构建日志会提供更多详细信息。

更重要的是在错误报告中附加一个独立的测试用例。除了您粘贴的代码之外,其他一些东西可能是导致崩溃的重要部分(并且可能无法复制或猜测该部分可能是什么)。这也让我们有更好的机会提出解决该问题的方法。

【讨论】:

  • 我确实首先点击了链接,但我觉得这是一个非常“通用”的答案。我在这里发布的原因是要找出这是否是 http 库的已知限制,或者我的代码是否应该受到责备。我会尝试将其报告为错误,希望我的问题可以产生一些替代方法。谢谢。
  • 是的,这是一个相当通用的答案,因为它是一个通用错误代码(AOT 时出现问题)。您发布的内容只是冰山一角(错误),没有我在上面提出的问题,没有人(甚至我们在 xamarin)可以提供更准确的答案。现在MT3001总是 错误,因为(即使您的代码中存在问题)我们应该能够报告更好、更准确的错误。
  • 我明白了。只是我刚刚注意到的一个小仅供参考:该项目在模拟器(v10.1)上构建并运行良好,但在我的手机(v10.1.1)上却没有。我会努力完成这个独立的测试用例,并在周末通过正确的渠道进行报告。
猜你喜欢
  • 2013-08-23
  • 1970-01-01
  • 2017-07-15
  • 2020-07-17
  • 2019-10-25
  • 2019-03-03
  • 2021-03-19
  • 1970-01-01
  • 2013-06-03
相关资源
最近更新 更多