通过Desktop Bridge迁移的WinForms转UWP应用升级时丢失用户设置
解决Desktop Bridge升级时WinForms应用用户设置丢失的问题
我之前帮不少开发者处理过这类问题,核心原因是UWP/Desktop Bridge的应用数据隔离机制和传统桌面应用完全不同——你之前用ClickOnce或MSI部署时,系统会自动处理用户设置的跨版本迁移,但Desktop Bridge应用默认不会继承传统桌面路径下的设置,升级时如果没做适配就会导致设置重置。
下面是针对性的解决方案,按优先级推荐:
1. 迁移到UWP官方应用数据存储API(最稳妥)
UWP提供的ApplicationData API对应的存储区域是系统专门为应用保留的,升级、卸载重装(保留数据选项)时都会自动保留,完全适配Desktop Bridge环境。
示例代码:
保存设置到本地存储
using Windows.Storage; using Newtonsoft.Json; // 用Json序列化复杂对象,也可替换为其他序列化方式 // 保存简单键值对设置 ApplicationData.Current.LocalSettings.Values["ThemePreference"] = "Dark"; // 保存复杂设置对象 var userSettings = new UserSettings { AutoLogin = true, LastOpenPath = @"C:\Docs" }; var localFolder = ApplicationData.Current.LocalFolder; var settingsFile = await localFolder.CreateFileAsync("appSettings.json", CreationCollisionOption.OpenIfExists); await FileIO.WriteTextAsync(settingsFile, JsonConvert.SerializeObject(userSettings));
读取设置
// 读取键值对设置 var defaultTheme = ApplicationData.Current.LocalSettings.Values["ThemePreference"] as string ?? "Light"; // 读取复杂设置对象 var localFolder = ApplicationData.Current.LocalFolder; try { var settingsFile = await localFolder.GetFileAsync("appSettings.json"); var settingsJson = await FileIO.ReadTextAsync(settingsFile); var userSettings = JsonConvert.DeserializeObject<UserSettings>(settingsJson); } catch (FileNotFoundException) { // 首次启动,初始化默认设置 var userSettings = new UserSettings(); }
2. 兼容传统Settings.Default的手动迁移方案
如果不想大规模修改代码,继续使用WinForms自带的Properties.Settings.Default,需要手动处理跨版本的设置迁移:
原理:
传统WinForms的Settings.Default默认存在%LOCALAPPDATA%\[公司名]\[应用名].exe_Url_[随机哈希]\[版本号]路径下,但Desktop Bridge升级后,新版本的哈希会变化,导致无法读取旧版本的设置。你需要在应用启动时,主动查找旧版本的设置文件并复制到当前版本的路径。
核心步骤:
- 获取当前版本的设置存储路径:
var currentSettingsPath = Properties.Settings.Default.FilePath;
- 遍历
%LOCALAPPDATA%\[公司名]下的所有子文件夹,找到旧版本的user.config文件; - 将旧文件的内容复制到当前版本的
user.config中(注意覆盖前备份,避免冲突); - 调用
Properties.Settings.Default.Reload()加载迁移后的设置。
3. 关键配置检查
- 确保打包项目的Package Family Name在升级前后完全一致:这个标识是系统识别同一应用的核心,如果变更,系统会把新版本当成新应用,直接清空旧数据;
- 不要将设置存在
Package.Current.InstalledLocation:这个是应用包的安装目录,只读且升级时会被完全替换,绝对不能存用户设置。
内容的提问来源于stack exchange,提问作者Elkland Technologies
相关产品推荐
相关产品推荐

