迁移含app.config和.settings的.NET Framework项目至.NET Core如何规避配置错误
解决.NET Core WinForms项目同时存在app.config和Settings.settings时的配置读取报错
我之前在迁移.NET Framework项目到.NET Core的时候也碰到过一模一样的问题,当时折腾了好半天,终于找到不用删除app.config就能解决的办法,跟你分享下:
问题根源
这个报错是Visual Studio的一个已知bug:当你手动添加app.config后,再通过项目属性的Settings标签生成Settings.settings文件时,VS会在app.config里重复写入配置节点(比如重复的<configSections>或<userSettings>)。运行时CLR的配置解析器对这种重复节点的容忍度更高,所以程序能正常读写设置,但VS自带的配置读取模块会判定XML无效,从而弹出报错。
解决步骤
- 先完全关闭Visual Studio(确保项目没有被占用)
- 找到项目目录下的
app.config文件,用记事本或者VS Code这类文本编辑器打开 - 检查文件内容,你会发现存在重复的配置节点——通常是两个
<configSections>,或者两组<userSettings> - 合并并清理配置:
- 只保留一个
<configSections>节点,把另一个节点里的内容(比如Settings对应的sectionGroup)合并到保留的节点中 - 删除重复的
<userSettings>节点,只保留包含你创建的Setting配置项的那一组
- 只保留一个
- 保存修改后的
app.config,重新打开Visual Studio和项目,报错就会消失了
正确的app.config示例
这里给一个规范的配置文件模板(替换成你自己的项目命名空间即可):
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="YourProjectName.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> </sectionGroup> </configSections> <userSettings> <YourProjectName.Properties.Settings> <setting name="Setting" serializeAs="String"> <value>test</value> </setting> </YourProjectName.Properties.Settings> </userSettings> </configuration>
补充说明
后续再通过项目属性修改Settings时,VS会基于规范的配置文件进行更新,不会再出现重复节点的问题。另外这个bug在多个Visual Studio版本(包括你提到的16.7.3)中都存在,只要保证app.config的XML结构唯一、没有重复节点,就能彻底消除这个报错。
内容的提问来源于stack exchange,提问作者Matthew Watson
相关产品推荐
相关产品推荐

