2016-11-11 7 views
1

Xamarin Forms에서 HttpClient (SendAsync)를 사용하여 비디오를 업로드하기위한 진행률 표시기를 만들려고 노력했지만 도움을 요청해야합니다.사용자 정의 HttpContent가 빌드되지 않습니다. - 어셈블리를 사용할 수 없습니다. (mtouch)

업로드 자체가 정상적으로 작동하고 다른 모든 API가 호출되지만 업로드 진행 상황을 추적하기 위해 HttpContent 사용자 지정을 만들려고하면 프로젝트가 더 이상 빌드되지 않습니다.

오류 MT3001 : 어셈블리를 AOT 수 없습니다 '. [...] 아이폰 OS/OBJ/아이폰/디버그/빌드 iphone7.2-10.1.1/엠 터치 캐시/구축/theproject.dll' StreamContent 또는 ByteArrayContent를 사용 (MT3001) (theproject.iOS)

대신 프로젝트 빌드,하지만 난 그것을 진행 상황을 추적하기 위해 노력 얻을 수 없습니다. 나는 희망 올바르게 스트림에 내 바이트의 변환하여이를 사용

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'를 사용하고 있습니까? 증분 빌드 도움말을 비활성화합니까? Check this this and linked issues : https://bugzilla.xamarin.com/show_bug.cgi?id=43689 – SushiHangover

+0

@SushiHangover Xamarin.iOS 버전. 10.2.0.4 (Xamarin Indie), 증분 빌드를 사용할 수 없습니다. – Mackan

답변

2

XS에서 오류를 두 번 클릭하면 문제에 대한 자세한 설명을 제공하는 웹 페이지로 이동합니다. 예 :

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