Ionic结合.NET Core 2.0遇IBM437编码及程序集加载错误求助
我来帮你一步步梳理这个问题的解决思路,你遇到的其实是编码支持缺失和NuGet包版本不兼容两个关联问题:
错误根源拆解
第一个错误 'IBM437' is not a supported encoding name,是因为.NET Core默认只包含有限的编码集,像IBM437这种老式DOS编码不在默认支持范围内,需要手动注册编码提供器。
而你尝试注册时触发的FileLoadException,核心原因是你安装的System.Text.Encoding.CodePages包版本和.NET Core 2.0不匹配——高版本的这个包是为.NET Core 3.x及以上版本设计的,和2.0的程序集清单(manifest)不兼容,所以才会出现“manifest definition does not match the assembly reference”的冲突。
具体解决步骤
1. 安装适配.NET Core 2.0的CodePages包
先卸载当前的System.Text.Encoding.CodePages包,再安装对应版本:
- 使用NuGet包管理器控制台执行:
Uninstall-Package System.Text.Encoding.CodePages Install-Package System.Text.Encoding.CodePages -Version 2.0.0 - 或者直接修改项目
.csproj文件的包引用:<PackageReference Include="System.Text.Encoding.CodePages" Version="2.0.0" />
2. 提前注册编码提供器
确保在调用ZipFile之前完成编码提供器的注册,建议放在应用启动的初始化代码里(比如Startup.cs的ConfigureServices方法,或Program.cs的入口处):
using System.Text; // ... Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
3. 确保DotNetZip包兼容.NET Core 2.0
你用到的Ionic.Zip本质是DotNetZip库,要确认它的版本支持.NET Core 2.0。推荐使用适配.NET Standard 2.0的DotNetZip 1.16.0版本,如果当前版本过高,可降级到这个版本避免兼容性问题。
4. 优化路径拼接(可选但推荐)
手动拼接路径容易出现转义错误,建议用Path.Combine构建zip文件路径:
string zipFilePath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, $"{zipfilename}.zip"); ZipFile zip = new ZipFile(zipFilePath);
额外提示
.NET Core 2.0属于较老旧的版本,后续如果有机会升级到.NET Core 3.1或.NET 6+,这类编码兼容问题会大幅减少,因为高版本.NET默认包含了更多编码支持。
内容的提问来源于stack exchange,提问作者Rich

