2

我正在使用Xamarin和MVVMCross实现一个Android应用程序。在我的PCL我有一个ZipUtility类和下面的方法:无效的il代码System.IO.Compression.ZipFile.OpenRead()方法正文为空

public NoDataResponse UnCompressZipFile(string path, string filename) 
    { 
     NoDataResponse response = new NoDataResponse(); 
     StringBuilder sb = new StringBuilder(); 
     sb.AppendLine(string.Format("\r\nUnzipping '{0}' in '{1}' folder...", filename, path)); 

     try 
     {  


      using (ZipArchive archive = ZipFile.Open(filename, ZipArchiveMode.Read)) 
      { 
       foreach (System.IO.Compression.ZipArchiveEntry entry in archive.Entries) 
       { 
        if (entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase)) 
        { 
         System.IO.Compression.ZipFile.ExtractToDirectory(filename, path); 
         break; 
        } 
       } 
      } 


      response.IsCallSuccessful = true; 
      sb.AppendLine(string.Format("\r\nFinished Unzipping file {0}.\r\n", filename)); 

      response.BusinessEntityMessage = sb.ToString(); 
     } 

     catch (Exception ex) 
     { 
      response.IsCallSuccessful = false; 
      response.BusinessEntityMessage = "\r\nUNZIPPING ERROR: " + ex.Message + "\r\n"; 
     } 

     return response; 
    } 

zip文件类我的方法里面是System.IO.Compression(System.IO.Compression.FileSystem命名空间)的一部分。

当我执行我得到以下错误的方法:

System.InvalidProgramException:无效IL代码在System.IO.Compression.ZipFile:打开(字符串,System.IO.Compression.ZipArchiveMode):方法体是空的。 at HHT.Core.Globals.ZipUtility.UnCompressZipFile(System.String path,System.String filename)[0x00033] in c:\ Sandbox \ HHT-ANDROID \ HHTApp \ HHT.Core \ Globals \ ZipUtility.cs:32

我不确定缺少什么,因为相同的代码在PCL之前完美工作。

我也尝试从我的DROIDUI项目中使用依赖注入(N = 31 slodge)运行相同的类,但仍然得到相同的错误。

我希望对此有任何意见或想法。

回答

3

这听起来像你正在部署一个引用程序集到你的Android设备(一个引用程序集仅用于编译,因此不包含IL)。

您正在使用哪个版本的System.IO.Compression?我假设你正在使用Microsoft.Bcl.Compression NuGet包?

我们的NuGet包不提供Android的实施。事实上,我们只为Windows Phone发布了一个实现 - 对于我们使用平台附带的其他平台。

我不确定Xamarin是否支持System.IO.Compression.dll(其中包含ZipArchive)。之前可能起作用的原因是因为您在安装NuGet软件包后重新定位PCL。

+0

非常感谢您的意见。其实你解决了我的问题。正如你所猜测的那样,我正在提供一个参考汇编。只要我从C:\ Windows \ Microsoft.Net \ Framework中引用了System.IO.Compression,它就起作用了。再次感谢您。 – Spyros

+0

不客气。这听起来不像是正确的修复,但你不应该直接添加对平台实现的引用,因为这可能会破坏其他场景。然而,如果这能解决你的问题,而不是Xamarin方面的错误。更好的临时解决方法是继续使用PCL中的NuGet包,并确保您的应用程序不部署System.IO.Compression.dll。 –

+0

我昨天已经更新到最新的Xamarin Android版本和我的ZipArchive类了我System.NotImplementedException:请求的功能未实现。我不知道我以前使用的Xamarin Android版本是否因为允许类完全正常工作而产生了一个错误。当你说继续使用Nuget包时,你的意思是Microsoft.Bcl.Compression是否正确?说实话,我还没有使用过那个,但正如你所说,你只发布Windows Phone的实现,所以它甚至不会允许我从Nuget安装它。 – Spyros

1

根据您的调查结果,到目前为止,我敢打赌,你就可以通过复制Xamarin.Android System.IO.Compression.dll from the Mac installer进入到修复错误:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoAndroid\v1.0\

目前(意外)从Xamarin.Android Windows安装缺少这种组装。关于这个问题已经提出了一个错误,所以程序集应该在未来的版本中默认存在。

如果这不起作用,一定要报告结果,以便我们可以进一步调查!

+0

嗨布伦丹。我已经引用了您在DroidUI项目中的Xamarin Developers站点中附带的zip文件的内容,但仍然是同样的问题。 System.NotImplementedException:请求的功能没有实现。System.IO.Compression.ZipArchive..ctor(System.IO.Stream流)[0x00000]在System.IO.Compression.ZipFile.Open(System.String archiveFileName,ZipArchiveMode模式,System.Text.Encoding entryNameEncoding)[0x00000] :0} – Spyros

+0

哦拍!确实是的。这个问题比我想象的更简单,Immo完全正确:[ZipArchive尚未在Mono中实现](https://github.com/mono/mono/blob/master/mcs/class/System.IO.Compression /ZipArchive.cs)。 –

相关问题