.NET 8.0 WPF初始化StringCollection时遇XmlSerializers加载失败问题
问题场景
在目标框架为.NET 8.0的WPF应用中,当在Settings里使用System.Collections.Specialized.StringCollection类型,尝试通过new StringCollection()初始化Properties.Settings.Default对应值时,抛出错误:
System.IO.FileNotFoundException: 'Could not load file or assembly 'System.Collections.Specialized.XmlSerializers, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL'. The system cannot find the file specified.'
即使已在项目文件中添加<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>配置,问题依然存在。
解决方案
1. 替换为List<string>类型(最简便)
StringCollection是较旧的非泛型集合,其序列化依赖专门的XmlSerializers程序集。改用List<string>作为Settings的类型:
- 打开Settings设计器,删除原有的StringCollection类型设置项
- 添加新设置项,类型选择
System.Collections.Generic.List<string>,范围设为User - 初始化时直接用
new List<string>(),无需额外处理序列化程序集,完全规避该问题
2. 手动生成所需的XmlSerializers程序集
如果必须使用StringCollection,可以通过.NET SDK自带的sgen.exe工具生成对应的序列化程序集:
- 找到.NET 8对应的
sgen.exe路径,通常位于C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\8.0.x\ref\net8.0附近(根据你的SDK安装路径调整) - 打开命令提示符,执行命令:
sgen.exe /assembly:System.Collections.Specialized.dll - 将生成的
System.Collections.Specialized.XmlSerializers.dll复制到你的WPF应用输出目录(如bin\Debug\net8.0-windows)
3. 调整项目序列化配置并启用绑定重定向
修改项目文件(.csproj)中的配置,替换原有的<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>为:
<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
- 清理并重新生成项目,VS会自动生成必要的序列化程序集和绑定重定向配置,解决程序集加载问题
4. 修改Settings的序列化模式
在Settings设计器中,选中StringCollection类型的设置项,查看属性窗口中的序列化模式(Serialization Mode),将其从Xml改为Binary:
- 这种方式会使用二进制序列化替代Xml序列化,不再依赖XmlSerializers程序集
- 注意:二进制序列化的Settings数据无法直接编辑配置文件,需通过代码读写
内容的提问来源于stack exchange,提问作者AeroClassics

