如何使用 ConfigurationManager 通过 ClickOnce 更新持久化 app.config?
Posted
技术标签:
【中文标题】如何使用 ConfigurationManager 通过 ClickOnce 更新持久化 app.config?【英文标题】:How to persist app.config through ClickOnce updates using ConfigurationManager? 【发布时间】:2010-11-03 15:25:35 【问题描述】:This question 准确地描述了我的问题,除了我在app.config
和ConfigurationManager
中使用自定义配置部分,所以那里提出的解决方案不适用...
基本上,我的问题是当 ClickOnce 更新应用程序时,它会使用新的 app.config 安装到不同的目录中,从而删除所做的任何更改。我的应用程序使用 app.config 来保存应用程序设置,所以这非常糟糕......合并更新会非常好(类似于在另一个问题中实现的),但在这一点上几乎任何自动化都会很好。
或者我应该只为我的 app.config 文件使用一个设置的位置,而不是尝试使用默认位置?
【问题讨论】:
【参考方案1】:ClickOnce 应该在更新之间维护用户设置,但由于未知原因(并且结果不佳),我已经失败了一次或两次。我没有尝试过自定义配置设置,但我对 ClickOnce 不覆盖设置的能力失去了信心。
我计划使用的方法是手动处理 ClickOnce 更新,而不是允许应用。检查更新并提示用户安装。我也有几个用户不接受更新,这很难恢复。通过手动处理更新,我希望能够在更新之前将用户设置读入内存,然后在更新完成后将它们写回。有一个 ApplicationUpdated 事件应该可以达到这个目的。
也许这种方法也适合你。
编辑添加参考:
How to: Check for Application Updates Programmatically Using the ClickOnce Deployment API ApplicationSettingsBase.Upgrade Method ApplicationDeployment Class谷歌搜索 ApplicationDeployment 也应该有所帮助。
【讨论】:
这个 ApplicationUpdated 事件在哪里?我在对象浏览器中找不到它...此外,这对问题没有帮助(尽管这是一个不错的功能,我从不喜欢 ClickOnce 对话框),更新仍然安装到新目录,所以旧的app.config 丢失 回复:关于 ApplicationSettingsBase 的第二个链接,我继承自 ConfigurationSection,所以这不是我的选择吗? 看看 Deployment.Application.ApplicationDeployment 类。当我提到 ApplicationUpdated 事件时,我想我正在查看示例代码。我意识到旧的 app.config 丢失了,我的想法是从当前配置中读取用户设置,更新,然后将用户设置写入新配置。 可悲的是,找到新配置的位置与找到旧配置的位置一样困难......或者是吗?我无法理解 clickonce 应用程序的目录结构......我的是一个完全信任的应用程序,所以权限不是问题,如果我们能弄清楚那么多 现在我只是简单地将 app.config 放在 %appdata% 中的适当位置,它可以工作并且在更新期间不会被触及...也让我基于我的用户我也想要的设置,所以我想这是一个双赢的局面......以上是关于如何使用 ConfigurationManager 通过 ClickOnce 更新持久化 app.config?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ConfigurationManager 通过 ClickOnce 更新持久化 app.config?
如何使用 ConfigurationManager 从 appsetting 中获取连接字符串?
如何使用ConfigurationManager读写配置文件
如何使用ConfigurationManager? (Microsoft.IdentityModel.Protocols)
如何在 Azure 的 ConfigurationManager.ConnectionStrings 上使用 ConnectionStrings 创建 EF 迁移?