You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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升级后,新版本的哈希会变化,导致无法读取旧版本的设置。你需要在应用启动时,主动查找旧版本的设置文件并复制到当前版本的路径。

核心步骤:

  1. 获取当前版本的设置存储路径:
var currentSettingsPath = Properties.Settings.Default.FilePath;
  1. 遍历%LOCALAPPDATA%\[公司名]下的所有子文件夹,找到旧版本的user.config文件;
  2. 将旧文件的内容复制到当前版本的user.config中(注意覆盖前备份,避免冲突);
  3. 调用Properties.Settings.Default.Reload()加载迁移后的设置。

3. 关键配置检查

  • 确保打包项目的Package Family Name在升级前后完全一致:这个标识是系统识别同一应用的核心,如果变更,系统会把新版本当成新应用,直接清空旧数据;
  • 不要将设置存在Package.Current.InstalledLocation:这个是应用包的安装目录,只读且升级时会被完全替换,绝对不能存用户设置。

内容的提问来源于stack exchange,提问作者Elkland Technologies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:02:04