更新 WPF 桌面桥通用应用程序时无法升级设置
Can't upgrade settings when updating a WPF Desktop Bridge Universal app
我的应用程序是用 WPF C# 编写的,我使用直接从 Visual Studio.
使用 MSIX 应用程序项目将其导出为通用应用程序
我只是无法让设置在更新之间保持不变。我在 MainWindow_Loaded
事件中使用了以下代码:
Settings.Default.Upgrade();
Settings.Default.Save();
Settings.Default.Reload();
我尝试保持程序集信息版本相同,只是增加 appx.manifest 中的版本,但它不起作用。
我注意到,每次应用程序更新时,它都会创建一个新的唯一命名的父设置文件夹(每次都有一个新的散列),子文件夹名称是程序集中的版本。文件夹结构是这样的:
App.exe_Url_dfvfmfjs1qo33zsag1ay5w1s0rwg0u53/0.2.10.0/user.config
App.exe_Url_tazrvujdga5ujjarnahpkoscv5zbkgl0/0.2.10.0/user.config
我认为这可能与以下事实有关:它不断生成新的哈希值,而不是仅仅将新版本作为子文件夹放置,这就是升级不执行任何操作的原因。
到目前为止我找到的唯一信息是使用 Settings.Default.Upgrade()
当我的通用桌面桥应用程序更新时,我应该如何将旧版本设置转移到新版本?
据我研究,这些设置不会传输到使用 Desktop Bridge 的 UWP 更新。于是开始使用UWP的原生ApplicationData.Settings
作为解决方法,我创建了 2 种方法来使用 LocalSettings
更新新创建的 WPF 设置,这是 UWP 等效项,反之亦然。 UWP 的 LocalSettings
更新传输。我在保存 WPF 设置时调用 Update()
,在应用程序启动时调用 Load()
。有效。
这是代码,到目前为止我发现的唯一警告是你应该使用基本类型,因为这些方法将无法传输像 List<string>
或 StringCollection
这样的东西,为此我'我正在使用序列化,尽管您也可以随时调整它们来做到这一点:
static class UWPSettings
{
public static void Update()
{
if (Startup.IsUniversalPlatform)
{
foreach (SettingsPropertyValue value in Properties.Settings.Default.PropertyValues)
{
ApplicationData.Current.LocalSettings.Values[value.Name] = value.PropertyValue;
}
}
}
public static void Load()
{
if (Startup.IsUniversalPlatform)
{
foreach (var setting in ApplicationData.Current.LocalSettings.Values)
{
foreach (SettingsPropertyValue s in Properties.Settings.Default.PropertyValues)
{
if (s.Name == setting.Key)
{
s.PropertyValue = setting.Value;
}
}
}
Properties.Settings.Default.Save();
}
}
}
我的应用程序是用 WPF C# 编写的,我使用直接从 Visual Studio.
使用 MSIX 应用程序项目将其导出为通用应用程序我只是无法让设置在更新之间保持不变。我在 MainWindow_Loaded
事件中使用了以下代码:
Settings.Default.Upgrade();
Settings.Default.Save();
Settings.Default.Reload();
我尝试保持程序集信息版本相同,只是增加 appx.manifest 中的版本,但它不起作用。
我注意到,每次应用程序更新时,它都会创建一个新的唯一命名的父设置文件夹(每次都有一个新的散列),子文件夹名称是程序集中的版本。文件夹结构是这样的:
App.exe_Url_dfvfmfjs1qo33zsag1ay5w1s0rwg0u53/0.2.10.0/user.config
App.exe_Url_tazrvujdga5ujjarnahpkoscv5zbkgl0/0.2.10.0/user.config
我认为这可能与以下事实有关:它不断生成新的哈希值,而不是仅仅将新版本作为子文件夹放置,这就是升级不执行任何操作的原因。
到目前为止我找到的唯一信息是使用 Settings.Default.Upgrade()
当我的通用桌面桥应用程序更新时,我应该如何将旧版本设置转移到新版本?
据我研究,这些设置不会传输到使用 Desktop Bridge 的 UWP 更新。于是开始使用UWP的原生ApplicationData.Settings
作为解决方法,我创建了 2 种方法来使用 LocalSettings
更新新创建的 WPF 设置,这是 UWP 等效项,反之亦然。 UWP 的 LocalSettings
更新传输。我在保存 WPF 设置时调用 Update()
,在应用程序启动时调用 Load()
。有效。
这是代码,到目前为止我发现的唯一警告是你应该使用基本类型,因为这些方法将无法传输像 List<string>
或 StringCollection
这样的东西,为此我'我正在使用序列化,尽管您也可以随时调整它们来做到这一点:
static class UWPSettings
{
public static void Update()
{
if (Startup.IsUniversalPlatform)
{
foreach (SettingsPropertyValue value in Properties.Settings.Default.PropertyValues)
{
ApplicationData.Current.LocalSettings.Values[value.Name] = value.PropertyValue;
}
}
}
public static void Load()
{
if (Startup.IsUniversalPlatform)
{
foreach (var setting in ApplicationData.Current.LocalSettings.Values)
{
foreach (SettingsPropertyValue s in Properties.Settings.Default.PropertyValues)
{
if (s.Name == setting.Key)
{
s.PropertyValue = setting.Value;
}
}
}
Properties.Settings.Default.Save();
}
}
}