【问题标题】:Why does a CoreRT-compiled program fail to work with ZIP files?为什么 CoreRT 编译的程序无法处理 ZIP 文件?
【发布时间】:2025-11-22 15:50:01
【问题描述】:

我写了以下简单的程序来测试:

using System;
using System.IO;
using System.IO.Compression;

namespace HelloZip
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = Path.Combine(AppContext.BaseDirectory, "test.zip");

            using (ZipArchive z = ZipFile.Open(path, ZipArchiveMode.Create))
            {
                var f = z.CreateEntry("hello.txt");
                using (StreamWriter writer = new StreamWriter(f.Open()))
                {
                    writer.Write("Hello World!");
                }
            }
        }
    }
}

根据 this page,我从 HelloZip 项目目录运行 dotnet new nuget,在 nuget.config 中添加推荐的包源,然后运行以下命令:

dotnet add package Microsoft.DotNet.ILCompiler -v 1.0.0-alpha-*
dotnet publish -r win-x64 -c release -o out
out\HelloZip.exe

我收到以下错误:

Unhandled Exception: System.IO.Compression.ZLibException: The underlying compression routine could not be loaded correctly. ---> System.DllNotFoundException: Unable to load DLL 'clrcompression.dll': The specified module could not be found.
   at HelloZip!<BaseAddress>+0x1199e7
   at HelloZip!<BaseAddress>+0x119904
   at Interop.zlib.DeflateInit2_(ZLibNative.ZStream&, ZLibNative.CompressionLevel, ZLibNative.CompressionMethod, Int32, Int32, ZLibNative.CompressionStrategy) + 0x48
   at System.IO.Compression.ZLibNative.ZLibStreamHandle.DeflateInit2_(ZLibNative.CompressionLevel, Int32, Int32, ZLibNative.CompressionStrategy) + 0x4f
   at System.IO.Compression.Deflater.DeflateInit(ZLibNative.CompressionLevel, Int32, Int32, ZLibNative.CompressionStrategy) + 0x59

   --- End of inner exception stack trace ---
   at System.IO.Compression.Deflater.DeflateInit(ZLibNative.CompressionLevel, Int32, Int32, ZLibNative.CompressionStrategy) + 0x1db
   at System.IO.Compression.Deflater..ctor(CompressionLevel, Int32) + 0x50
   at System.IO.Compression.DeflateStream.InitializeDeflater(Stream, Boolean, Int32, CompressionLevel) + 0x39
   at System.IO.Compression.ZipArchiveEntry.GetDataCompressor(Stream, Boolean, EventHandler) + 0x4b
   at System.IO.Compression.ZipArchiveEntry.OpenInWriteMode() + 0x65
   at HelloZip.Program.Main(String[]) + 0x75
   at HelloZip!<BaseAddress>+0x1716a2

是我弄错了,还是 AOT 编译器还没有正确支持 System.IO.Compression?

【问题讨论】:

    标签: .net-core system.io.compression corert


    【解决方案1】:

    您遇到了一个已知的未实现的功能。解决方法是暂时手动将 clrcompression.dll 复制到已编译的可执行文件旁边。在此处查看详细信息:https://github.com/dotnet/corert/issues/5496

    【讨论】:

    • 我将 clrcompression.dll 添加到目录中(版本 4.6.26515.6),唯一的区别是内部 DllNotFoundException 被替换为 EntryPointNotFoundException:Unable to find an entry point named 'CompressionNative_DeflateInit2_' in DLL 'clrcompression.dll'.
    • 能够从其他地方获取更新版本的 DLL。感谢您为我指明正确的方向!
    最近更新 更多