如何防止程序覆盖更新时Application Settings配置被清空
问题原因
你遇到的配置清空本质是配置路径不匹配,不是文件被覆盖删除:.NET 默认的 Application Settings 存储路径会和程序集版本、强名称标识、发布特征绑定计算哈希值,Self-Contained/Single File 模式发布时,只要更新版本后程序集版本、构建生成的运行标识有变动,运行时就会生成全新的配置存储目录,不会自动读取旧版本目录下的配置,表现出来就是所有配置重置。
解决方法
按推荐优先级排序:
- 自定义固定配置存储路径(最适配单文件发布场景)
弃用默认随版本变动的存储逻辑,手动指定和版本无关的固定存储位置,比如用户目录下的%AppData%\[你的程序名]\user.config。实现时重写默认Settings的配置提供程序,将所有配置读写操作指向这个固定路径即可,只要用户不手动删除该目录,无论怎么覆盖更新程序,配置都不会丢失。
注意:不要把配置存在程序自身的安装目录下,否则用户覆盖安装时如果清空安装目录,还是会弄丢配置。 - 启动时自动迁移旧版本配置
如果不想改动默认存储逻辑,可以在程序启动阶段加自动迁移逻辑:- 在项目的Settings设计器里新增一个布尔类型的配置项,命名为
IsFirstRunAfterUpdate,默认值设为true,作用域选User级别 - 在WPF程序的启动逻辑(
App.xaml.cs重写OnStartup方法)里加入以下代码:protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); if (Properties.Settings.Default.IsFirstRunAfterUpdate) { Properties.Settings.Default.Upgrade(); Properties.Settings.Default.IsFirstRunAfterUpdate = false; Properties.Settings.Default.Save(); } }
Upgrade()方法时,运行时会自动搜索当前程序在本机所有历史版本生成的配置目录,把旧配置迁移到当前版本对应的新路径下。注意:这个方案生效的前提是各版本程序集的Guid、强名称签名保持一致,如果每次发布都随机生成程序集标识,迁移逻辑会找不到旧配置。如果发布时开启了程序集裁剪,需要把Settings相关类型加入裁剪排除列表,避免运行时找不到类型导致迁移失效。 - 在项目的Settings设计器里新增一个布尔类型的配置项,命名为
- 固定程序集标识复用原有配置路径
如果不想加迁移逻辑,可以调整项目配置保证每次发布的程序集标识完全一致:- 关闭自动递增版本号功能,非必要不改动
AssemblyVersion值 - 不要每次发布都重新生成强名称密钥,固定项目的
AssemblyGuid值
这样更新后程序运行时计算出的配置路径和旧版本完全一致,会直接读取原有配置文件。
- 关闭自动递增版本号功能,非必要不改动
内容的提问来源于stack exchange,提问作者Melon NG
相关产品推荐
相关产品推荐

