我正在尝试自定义user.config
文件的位置.目前,它存储了哈希和版本号
%AppData%\[CompanyName]\[ExeName]_Url_[some_hash]\[Version]\
我希望它与应用程序的版本无关
%AppData%\[CompanyName]\[ProductName]\
可以这样做,怎么做?有什么影响?升级后,用户是否会丢失先前版本的设置?
我想添加这个引用的文本作为我将来遇到此问题时的参考.据说,您可以通过调用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().
我不相信它可以实际工作的一秒钟 - 微软不可能提供这种能力,但方法也是如此.
要回答第一个问题,您在技术上可以将文件放在任何位置,但是您必须自己编写代码,因为文件的默认位置是您的两个示例中的第一个.(链接到自己如何做)
至于第二个问题,它取决于您部署应用程序的方式.如果通过.msi进行部署,则安装项目的属性中有两个哈希值(构建msi),"升级代码"和"产品代码".这些决定了msi的安装方式,以及它是否可以升级,覆盖或安装在同一应用程序的任何其他版本旁边.
例如,如果您有两个版本的软件并且它们具有不同的"升级"代码,那么对于Windows而言,无论名称是什么,它们都是完全不同的软件.但是,如果"升级"代码相同,但"产品"代码不同,那么当您尝试安装第二个msi时,它会询问您是否要升级,此时它应该复制来自旧配置到新配置.如果两个值相同,并且版本号没有更改,那么新配置将与旧配置位于同一位置,并且它不必执行任何操作. MSDN文档
ClickOnce有点不同,因为它更多地基于ClickOnce版本#和URL路径,但我发现只要您继续"发布"到同一位置,新版本的应用程序将继续使用现有配置.(链接到ClickOnce如何处理更新)
我也知道有一种方法可以在使用自定义安装脚本安装msi时手动合并配置,但我不记得执行它的确切步骤...(请参阅此链接以了解如何使用Web进行操作.配置)
user.config文件存储在
c:\Documents and Settings>\
是用户数据目录,非漫游(上面的本地设置)或漫游.
是用户名.
是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