尝试使用以下代码在Win10 mobile(UWP)上解压缩文件
using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Read))
{
ZipArchiveEntry entry = archive.Entries.First();
using (Stream reader = entry.Open())
{
在entry.Open()处抛出以下错误。 “无法正确加载底层压缩例程。”
内部异常
“无法加载DLL'clrcompression.dll':找不到指定的模块。(HRESULT异常:0x8007007E)”
重要提示:
using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Create,true))
问题: 有人经历过同样的例外吗?它的根本原因是什么? 有哪些可用的解决方法? (我需要压缩跨平台文件)
更新:我按要求创建了简单的测试项目(感谢您查看)。
解压缩在测试项目中有效,但它正在加载一个不同的模块。 Debug / Modules窗口指出异常抛出项目使用System.IO.Compression.dll 4.06.24705.1,工作项目使用1.00.24301.1。
我上传了两个project.lock.json文件以进行比较https://1drv.ms/f/s!AqROiejT4oI3lL1q1tu3iJcfA2tKyg。
答案 0 :(得分:3)
我找到了根本原因。正如Jay Zuo所说,问题在于project.lock.json以某种方式引用了" System.IO.Compression 4.3.0"。
我没有直接在任何project.json文件中引用它。我通过.NETSTANDARD1.1项目间接引用它,引用了" NETStandard.Library":" 1.6.1"。
通过使用nuget.org,我搜索了一个" NETStandard.Library"版本使用较旧的System.IO.Compression 4.1.1,即" NETStandard.Library" 1.6.0。
使用" NETStandard.Library" 1.6.0。在.NETSTANDARD 1.1项目中修复了解压缩错误。
我上传了一个示例解决方案来重现错误。 https://1drv.ms/f/s!AqROiejT4oI3lMMc_jWogCQy36awrA
答案 1 :(得分:3)
对我来说,修复此问题是将其添加到.csproj文件中的第一个PropertyGroup
:
<NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
Visual Studio通常会隐式地为.NET Standard项目提供1.6.1,其中包含有问题的System.IO.Compression 4.3.0。该指令告诉它取下1.6.0,这取决于System.IO.Compression 4.1.1(适用于Windows Phone)。
请确保您没有其他NuGet引用,该引用正在引入4.3.0。 System.IO.Compression.dll的正确文件版本是1.0.24301.1,而损坏的文件版本是4.6.xxxx。
答案 2 :(得分:2)
根据您上传的“project.lock.json”,我认为此处的问题可能与System.IO.Compression 4.3.0 package有关。
在异常抛出项目中,您可以发现它使用“System.IO.Compression 4.3.0”,如下所示:
"runtime.native.System.IO.Compression/4.3.0": {
"type": "package",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0",
"Microsoft.NETCore.Targets": "1.1.0"
},
"compile": {
"lib/netstandard1.0/_._": {}
},
"runtime": {
"lib/netstandard1.0/_._": {}
}
},
...
"System.IO.Compression/4.3.0": {
"type": "package",
"dependencies": {
"System.Buffers": "4.3.0",
"System.Collections": "4.3.0",
"System.Diagnostics.Debug": "4.3.0",
"System.IO": "4.3.0",
"System.Resources.ResourceManager": "4.3.0",
"System.Runtime": "4.3.0",
"System.Runtime.Extensions": "4.3.0",
"System.Runtime.Handles": "4.3.0",
"System.Runtime.InteropServices": "4.3.0",
"System.Text.Encoding": "4.3.0",
"System.Threading": "4.3.0",
"System.Threading.Tasks": "4.3.0",
"runtime.native.System.IO.Compression": "4.3.0"
},
...
在工作项目中,它使用“System.IO.Compression 4.1.1”:
"runtime.native.System.IO.Compression/4.1.0": {
"type": "package",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1"
},
"compile": {
"lib/netstandard1.0/_._": {}
},
"runtime": {
"lib/netstandard1.0/_._": {}
}
},
...
"System.IO.Compression/4.1.1": {
"type": "package",
"dependencies": {
"System.Collections": "4.0.11",
"System.Diagnostics.Debug": "4.0.11",
"System.IO": "4.1.0",
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.Extensions": "4.1.0",
"System.Runtime.Handles": "4.0.1",
"System.Runtime.InteropServices": "4.1.0",
"System.Text.Encoding": "4.0.11",
"System.Threading": "4.0.11",
"System.Threading.Tasks": "4.0.11",
"runtime.native.System.IO.Compression": "4.1.0"
},
...
目前似乎无法在UWP项目中使用System.IO.Compression 4.3.0 package。目前最新的稳定版“Microsoft.NETCore.UniversalWindowsPlatform”包使用“System.IO.Compression 4.1.1”包。您应该能够通过在其中添加System.IO.Compression 4.3.0 package来重现您在工作项目中的问题,如下所示:
{
"dependencies": {
"Microsoft.NETCore.UniversalWindowsPlatform": "5.2.2",
"System.IO.Compression": "4.3.0"
},
"frameworks": {
"uap10.0": { }
},
"runtimes": {
"win10-arm": { },
"win10-arm-aot": { },
"win10-x86": { },
"win10-x86-aot": { },
"win10-x64": { },
"win10-x64-aot": { }
}
}
因此,要解决此问题,我建议您检查项目的引用,并确保没有“System.IO.Compression 4.3.0”软件包。如果确实需要使用“System.IO.Compression”软件包,可以尝试将其降级为“4.1.1”。