当前位置:  开发笔记 > 开发工具 > 正文

我可以控制.NET用户设置的位置,以避免丢失应用程序升级的设置吗?

如何解决《我可以控制.NET用户设置的位置,以避免丢失应用程序升级的设置吗?》经验,为你挑选了3个好方法。

我正在尝试自定义user.config文件的位置.目前,它存储了哈希和版本号

%AppData%\[CompanyName]\[ExeName]_Url_[some_hash]\[Version]\

我希望它与应用程序的版本无关

%AppData%\[CompanyName]\[ProductName]\

可以这样做,怎么做?有什么影响?升级后,用户是否会丢失先前版本的设置?



1> Ian Boyd..:

我想添加这个引用的文本作为我将来遇到此问题时的参考.据说,您可以通过调用Upgrade来指示ApplicationSettings基础结构复制先前版本的设置:

Properties.Settings.Value.Upgrade();

从客户端设置常见问题的博客帖子:(存档)

问:为什么user.config路径中有版本号?如果我部署新版本的应用程序,用户是否会丢失以前版本保存的所有设置?

答:user.config路径对版本敏感的原因有很多.

(1)支持并行部署不同版本的应用程序(例如,您可以使用Clickonce执行此操作).不同版本的应用程序可以保存不同的设置.

(2)升级应用程序时,设置类可能已被更改,可能与保存的内容不兼容,这可能会导致问题.

但是,我们可以轻松地将设置从先前版本的应用程序升级到最新版本.只需调用 ApplicationSettingsBase.Upgrade(),它将从先前版本中检索与该类当前版本匹配的设置,并将它们存储在当前版本的user.config文件中.您还可以选择在设置类或提供程序实现中覆盖此行为.

问:好的,但我如何知道何时致电升级?

A:好问题.在Clickonce中,当您安装新版本的应用程序时,ApplicationSettingsBase将检测它并在加载点设置时自动升级设置.在非Clickonce情况下,没有自动升级 - 您必须自己调用升级.这是确定何时调用升级的一个想法:

有一个名为CallUpgrade的布尔设置,并给它一个默认值true.当您的应用启动时,您可以执行以下操作:

if (Properties.Settings.Value.CallUpgrade)
{
   Properties.Settings.Value.Upgrade();
   Properties.Settings.Value.CallUpgrade = false;    
}

这将确保仅在部署新版本后第一次运行应用程序时调用Upgrade().

我不相信它可以实际工作的一秒钟 - 微软不可能提供这种能力,但方法也是如此.


这很好用,但我提醒读者,配置的路径但不包括版本号必须相同.即看@ Amr的答案.例如,如果从与先前版本不同的文件路径启动应用程序的新版本,则"升级"不起作用.
在将其更改为false后,不要忘记添加`Properties.Settings.Default.Save();`:-)
这完全奏效了!我只用了简单的`if(CallUpgrade){Upgrade(); 声明.

2> uzbones..:

要回答第一个问题,您在技术上可以将文件放在任何位置,但是您必须自己编写代码,因为文件的默认位置是您的两个示例中的第一个.(链接到自己如何做)

至于第二个问题,它取决于您部署应用程序的方式.如果通过.msi进行部署,则安装项目的属性中有两个哈希值(构建msi),"升级代码"和"产品代码".这些决定了msi的安装方式,以及它是否可以升级,覆盖或安装在同一应用程序的任何其他版本旁边.

例如,如果您有两个版本的软件并且它们具有不同的"升级"代码,那么对于Windows而言,无论名称是什么,它们都是完全不同的软件.但是,如果"升级"代码相同,但"产品"代码不同,那么当您尝试安装第二个msi时,它会询问您是否要升级,此时它应该复制来自旧配置到新配置.如果两个值相同,并且版本号没有更改,那么新配置将与旧配置位于同一位置,并且它不必执行任何操作. MSDN文档

ClickOnce有点不同,因为它更多地基于ClickOnce版本#和URL路径,但我发现只要您继续"发布"到同一位置,新版本的应用程序将继续使用现有配置.(链接到ClickOnce如何处理更新)

我也知道有一种方法可以在使用自定义安装脚本安装msi时手动合并配置,但我不记得执行它的确切步骤...(请参阅此链接以了解如何使用Web进行操作.配置)



3> Amr..:

user.config文件存储在

c:\Documents and Settings>\\[Local Settings\]Application Data\\__\

是用户数据目录,非漫游(上面的本地设置)或漫游.
是用户名.
是CompanyNameAttribute值(如果可用).否则,请忽略此元素.
是AppDomain.CurrentDomain.FriendlyName.这通常默认为.exe名称.
是基于可用于散列的证据的URL,StrongName或Path.
是从CurrentDomain收集的证据的SHA1哈希,按以下优先顺序排列:
1.StrongName
2. URL:
如果这些都不可用,请使用.exe路径.
是AssemblyInfo的AssemblyVersionAttribute设置.

完整描述在这里http://msdn.microsoft.com/en-us/library/ms379611.aspx

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有