2016-11-11 2 views
1

XamarinフォームでHttpClient(SendAsync)を使用してビデオをアップロードするための進捗インジケータを作成しようと努力しています。カスタムHttpContentがビルドされない - アセンブリをAOTできない(mtouch)

アップロード自体は正常に動作し、他のすべてのAPI呼び出しが動作しますが、アップロードの進行状況を追跡するためにカスタムHttpContentを作成しようとすると、プロジェクトはそれ以上ビルドされません。

エラーMT3001:アセンブリ をAOTことができませんでした '[...]のiOS/OBJ/iPhone /デバッグ/ビルドiphone7.2-10.1.1 /のmTouchキャッシュ//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でタグ付けされています。

+1

「Xamarin.iOS」のどのバージョンを使用していますか?インクリメンタルビルドのヘルプを無効にしますか?これとリンクされた問題をチェックアウトしてください:https://bugzilla.xamarin.com/show_bug.cgi?id=43689 – SushiHangover

+0

@SushiHangover Xamarin.iOS ver。 10.2.0.4(Xamarin Indie)では、インクリメンタルビルドが有効になっていません。 – Mackan

答えて

2

XSからエラーをダブルクリックすると、問題の詳細な説明が記載されたWebページが表示されます。例えば。

MT3001は、アセンブリをAOTませんでした '*'

これは、一般的にAOTコンパイラのバグを示します。バグ http://bugzilla.xamarin.comを使用して、 にエラーを再現できるプロジェクトを作成してください。

は、時にはそれがオプションを構築 は、プロジェクトのiOS版でビルドをインクリメンタル無効にすることでこの問題を回避することが可能です(ただし、それはまだバグですので、 はとにかくそれを報告してください)。

主なものは、およそ3001 AOTコンパイラは出力バイナリを生成しなかったことです。これにはいくつかの理由があります。一般的に、プロセスがクラッシュし、ビルドログにはさらに詳細な理由が表示されます。

さらに重要なことは、バグレポートに自己完結型テストケースを添付することです。あなたが貼り付けたコードのほかに、クラッシュにつながった重要な部分を演奏することができます(そして、その部分が何であるかを重複したり推測することは不可能かもしれません)。これにより、問題の回避策を提案する良い機会にもなります。

+0

私はリンクの最初のことに従ったが、私はそれが非常に「一般的な」答えであると感じた。私がここに投稿した理由は、これがhttpライブラリの既知の制限であるかどうか、あるいは私のコードが何らかの原因で責任があるかどうかを調べることでした。私はバグとして報告しようとします。うまくいけば私の質問はいくつかの代替方法を生み出すことができます。ありがとう。 – Mackan

+0

はい、一般的なエラーコードなので、かなり一般的な答えです(何かが間違っていたAOT'ing)。あなたが掲示したものは、氷山の先端(エラー)の唯一のものであり、誰も(私たちもザマリンで)私が上で尋ねなかったより正確な答えを提供することができます。今、 'MT3001'は**常に**バグです。あなたのコードに問題があっても、より正確で正確なエラーを報告できるはずです。 – poupou

+0

私は理解しています。ちょうど私が気づいた小さなFYI:プロジェクトはビルドし、シミュレータ(v10.1)上で正常に動作しますが、私の電話(v10.1.1)では動作しません。私は試して、自己完結型のテストケースを完成させ、週末に正しいチャネルを通して報告します。 – Mackan

関連する問題