2015-07-14 19 views
5

Wszystko działa poprawnie w trybie debugowania, ale gdy uruchamiamy go w wydaniu, wywołanie ExtractToDirectory kończy się niepowodzeniem.Xamarin Android: System.IO.Compression.ZipFile.ExtractToDirectory Błąd w trybie zwolnienia

Oto funkcja odniesienia. Aby upewnić się, że nie robimy nic dziwnego.

private bool UnzipFiles() 
    { 
     bool toReturn = true; 
     try 
     { 
      UpdateStatus("Almost done..."); 
      string file = Path.Combine (DownloadFolder, "ZipFile.zip"); 
      if(System.IO.Directory.Exists(UnzippingDestinationFolder)) 
      { 
       System.IO.Directory.Delete(UnzippingDestinationFolder, recursive:true); 
      } 

      System.IO.Compression.ZipFile.ExtractToDirectory(file, UnzippingDestinationFolder); 
      UpdateStatus("Finished!"); 
      var files = System.IO.Directory.GetFiles(UnzippingDestinationFolder); 

      int m = 3; 

     } 
     catch (Exception e) 
     { 
      toReturn = false; 
     } 

Wreszcie mamy wyjątek.

System.NullReferenceException: Object reference not set to an instance of an object 
    at SharpCompress.Common.Zip.Headers.ZipFileEntry.DecodeString (System.Byte[] str) [0x00000] in <filename unknown>:0 
    at SharpCompress.Common.Zip.Headers.DirectoryEntryHeader.Read (System.IO.BinaryReader reader) [0x00000] in <filename unknown>:0 
    at SharpCompress.Common.Zip.ZipHeaderFactory.ReadHeader (UInt32 headerBytes, System.IO.BinaryReader reader) [0x00000] in <filename unknown>:0 
    at SharpCompress.Common.Zip.SeekableZipHeaderFactory+<ReadSeekableHeader>c__Iterator0.MoveNext() [0x00000] in <filename unknown>:0 
    at SharpCompress.Archive.Zip.ZipArchive+<LoadEntries>c__Iterator0.MoveNext() [0x00000] in <filename unknown>:0 
    at SharpCompress.LazyReadOnlyCollection`1+LazyLoader[SharpCompress.Archive.Zip.ZipArchiveEntry].MoveNext() [0x00000] in <filename unknown>:0 
    at System.IO.Compression.ZipArchive.CreateZip (System.IO.Stream stream, ZipArchiveMode mode) [0x00000] in <filename unknown>:0 
    at System.IO.Compression.ZipArchive..ctor (System.IO.Stream stream, ZipArchiveMode mode, Boolean leaveOpen, System.Text.Encoding entryNameEncoding) [0x00000] in <filename unknown>:0 
    at System.IO.Compression.ZipFile.Open (System.String archiveFileName, ZipArchiveMode mode, System.Text.Encoding entryNameEncoding) [0x00000] in <filename unknown>:0 
    at System.IO.Compression.ZipFile.ExtractToDirectory (System.String sourceArchiveFileName, System.String destinationDirectoryName, System.Text.Encoding entryNameEncoding) [0x00000] in <filename unknown>:0 
    at System.IO.Compression.ZipFile.ExtractToDirectory (System.String sourceArchiveFileName, System.String destinationDirectoryName) [0x00000] in <filename unknown>:0 
    at NewBaron.Screens.DownloadContentScreen.UnzipFiles() [0x00000] in <filename unknown>:0 
+1

Kilka rzeczy do wypróbowania: - To jest biblioteka open source, umieścić kod źródłowy do projektu i debugowanie. Wartość zerowa będzie dość oczywista, gdy się pojawi. - Dołącz wszystkie zestawy znaków do pliku APK. [Opcje projektu] -> Kompilacja Androida -> Łącznik -> Umiędzynarodowienie. – matthewrdev

+2

Ponadto wyłącz linker w trybie Release. – matthewrdev

Odpowiedz

1

@ sugestia mattewrobbinsdev była dokładnie tym. Dla przyszłych czytelników, oto dialog w Xamarin Studio:

Dialog

+0

Byłoby użyteczne określenie * dlaczego * to naprawia ... Domyślam się, że linker usuwa API, które SharpCompress używa poprzez odbicie. Jeśli chcesz to naprawić bez wyłączania łącznika, określ klasę, która jest usuwana i użyj jej kodu pośredniczącego. Standardem jest utworzenie pliku 'LinkerPleaseInclude.cs': https://github.com/MvvmCross/MvvmCross/blob/v3/nuspec/DroidContent/LinkerPleaseInclude.cs.pp – matthewrdev

+0

Zachowanie łącza opcji: nie łącz, worket dla mnie. System.IO.Compression ulegał awarii podczas rozpakowywania pliku w trybie RELEASE. Problem polega na tym, że plik .APK powtarza jego rozmiar. W moim przypadku .APK miał 25 MB, a po nim nie było 50bm. – jzeferino

+0

Czy ktoś kiedykolwiek zarejestrował błąd w bugzilli Xamarina? – dotMorten

4

nieznaczne zmiany w roztworze Victora. Brak powiązania pakietów SDK wygenerował apk o wartości 53 MB. Zbyt duży dla limitu rozmiaru apk w sklepie Play.

ustawić zachowanie łączące połączyć tylko zespoły SDK i przyniósł rozmiar apk do 29MBs

Oto zaktualizowane okno.

enter image description here

+1

Znacznie lepsza odpowiedź. Również to rozwiązanie pomogło naprawić ten sam problem w aplikacji Xamarin.Mac. –

+0

Rozwiązało to mój problem, utrzymując mały plik .apk z powodu tylko zestawów SDK. – jzeferino

Powiązane problemy