向 app.config 添加了新的应用程序设置,但 MSI 不会安装它(不会覆盖)

2023-12-02

我们最近向旧版 winforms 应用程序 (.Net 4.6.1) 的 app.config(日志服务器的 URL)添加了新的应用程序设置(不是用户设置)。

旧版本是 1.0.3,我们将所有程序集的版本更改为 1.0.4,并在安装项目(Visual Studio 2017 安装程序项目)中更改版本以匹配放弃弹出窗口以更改产品代码,我们做过。

安装运行正确(顺便说一句,其他内容也发生了更改,并且这些更改在新版本中是正确的),但我们的新 app.config 设置却不然。奇怪的是,如果您手动删除配置文件并重新运行应用程序,它会重新创建配置文件,从而导致新设置出现。知道这里发生了什么吗?

Thanks!


您可能没有使用 WiX,但我会添加我在注意到您没有添加 WiX 作为标签之前所写的内容。必须学会读书。


这可能是 MSI / WiX 部署中最常见的问题,以及主要升级期间配置设置被删除的问题。我假设你已经设置了应用程序配置在安装过程中永久保存文件以在主要升级期间保留它?

可能发生的情况是,您已将配置文件安装为文件,但它应该安装为一堆可以合并到目标文件中的 XML 配置设置。

MSI 文件版本控制规则尝试保留安装后已修改的非版本化文件。因此,如果升级时文件的创建日期和修改日期不同,则不会覆盖非版本化文件。您的文件将显示为未受影响,没有最新的所需值。它已被“保存”。

您可以更新 WiX 源以使用适当的 WiX XML 元素设置所需的值。有两个不同的相关元素:

  • XmlConfig 元素
  • Xml文件元素

关于这两个元素之间的差异,我引用鲍勃·阿恩森(WiX 开发人员):“您可以使用 XmlConfig 执行 XmlFile 支持的所有操作(以及更多操作),但它需要额外的创作,而 XmlFile 则不需要这些操作。 XmlFile 最擅长修改正在安装的 XML 文件(例如,添加反映文件安装路径的属性);它无法在卸载时删除修改,但如果您的安装程序安装了该文件,它无论如何都会被卸载。 XmlConfig 最擅长修改共享 XML 文件,因为它支持卸载修改。" (source).


我发现这个 XML 东西非常繁琐,而且我可能不会使用最新和最好的技术,但这里有一个快速示例。彻底测试 - 特别是卸载和升级场景 - 我进行的有限测试:

这是我的测试 XML 文件(实际上作为文件安装然后更新)。请检查您保存的文件的编码 -已报告一些编码问题- 不确定当前状态是什么:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <ExistingConfig>
    <bindingRedirect oldVersion="0.0.0" newVersion="0.0.0" />
  </ExistingConfig>
</configuration>

这是将更新文件(并安装文件)的 WiX 片段。将上述 XML 测试文件放在 WXS 源文件旁边,或者在构建 MSI 之前指定正确的源路径。

<Component Feature='ProductFeature'>

 <!--Installs the base file-->
 <File Source='app.config' />

 <!--Create New Element-->
 <util:XmlFile Id='XmlSettings1' File='[#app.config]' Action='createElement' 
               Name='MyConfig' ElementPath='//configuration' Sequence='1' />

 <!--Set New Value-->
 <util:XmlFile Id='XmlSettings2' File='[#app.config]' Action='setValue' 
              Name='newVersion' Value='6.6.8' ElementPath='//configuration/MyConfig' Sequence='2' />

<!--Set New Value-->
<util:XmlFile Id='XmlSettings3' File='[#app.config]' Action='setValue' 
              Name='Server' Value='Pusevov' ElementPath='//configuration/MyConfig' Sequence='3' />

<!--Update Existing Value, Existing Element-->
<util:XmlFile Id='XmlSettings4' File='[#app.config]'
  Action='setValue' Name='newVersion' Value='7.7.7' ElementPath='//configuration/ExistingConfig/bindingRedirect' Sequence='4' />

</Component>

我希望这是有道理的。就像我说的,我有时发现这很繁琐且容易出错,但用于此类更新的其他工具也是如此。请记住首先尝试使用原始测试用例并进行测试安装以测试运行时错误。制作一些可行的小东西,然后在其基础上进行构建——这显然是不言而喻的,但一次性尝试所有这些都是很诱人的。 “洞里有火,寻找掩护!”。

一些保管链接:

  • Firegiant XML 教程
  • 使用 XPath 在 WIX 中删除具有 XmlConfig 扩展的 XML 元素
  • WIX util:xmlfile 文件名是 Source 属性
  • WIX v3 和 XmlConfig / XmlFile 故障排除(从时光机复活)
  • 关于 WiX 和 XML 的分步博客
  • 如何强制 wix 在升级操作之前更新文件
  • 在基于 WiX 的安装期间获取配置文件的应用程序设置
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向 app.config 添加了新的应用程序设置,但 MSI 不会安装它(不会覆盖) 的相关文章

随机推荐

  • Docker 在 docker run 命令上给出“没有这样的文件或目录:未知”

    我能够成功构建 Docker 镜像 通过docker build t foo bar 这是它的Dockerfile FROM ubuntu 20 04 COPY benchmark sh home benchmarking programm
  • 根据数据集中的另一个变量设置背景颜色

    我试图展示春分对我的数据的影响 即全年一系列远程跟踪的鸟类数据 为了做到这一点 我想绘制一年中每一天的纬度 并将春分效果作为背景中的颜色分级 我的数据看起来像这样 SO lt data frame date seq as Date 2000
  • 如何将 TIMESTAMPDIFF 添加到 SqlSoup 查询?

    我有一个正在运行并使用 SqlSoup 的报告程序 并且现在由 SqlSoup 调用生成整个查询 MySqL 函数除外 TIMESTAMPDIFF 实际的 SQL 短语应该是 TIMESTAMPDIFF PERIOD start time
  • JavaFX 2 WebView:如何增强滚动条

    我已经使用 JavaFX WebView 实现了日志查看器 然而 对于该日志查看器的用户来说 有一个大问题 网络查看器的滚动条非常细 我什至遇到了一个问题 在 Windows 7 XP 上 奇怪的是在 Windows 8 上没有 当单击滚动
  • 有人能解释一下 C# 中“按值传递”和“按引用传递”是什么意思吗?

    我不太确定 C 中 按值传递 和 按引用传递 的概念 我认为按值传递意味着 int i 9 我们将 int i 传递给一个方法 例如 method i 通过引用传递意味着精确传递其位置 例如 Class method variable 它会
  • Bootstrap 5 - 卡片元素在底部对齐

    好吧 我是 Bootstrap 的新手 我试图将一个按钮元素始终放在卡片的底部 即使正文很小 然而 我总是收到这个结果 它没有将我的按钮放在我需要的右下角
  • Android 纹理文本

    如何制作带有纹理而不是文本颜色或渐变的文本 例如 png 文件 就像是this 我理解逻辑 我应该使文本颜色透明并放在文本位图下方 我想我无法通过Textview 我不知道如何使用画布或 OpenGL 来做到这一点 有什么想法吗 这是一种使
  • 颠覆错误“无法读取状态行”是什么意思?

    这是一个相当基本的问题 但它让我发疯 我在 beanstalk com 上建立了一个全新的存储库 他们给了我网址 http my name svn beanstalkapp com blog 他们还会在存储库中自动创建标签 主干和分支文件夹
  • 奇怪:无法改变jni中Integer的值

    我用C编写了一个jni函数来设置两个java Integer对象的值 就像这样 jni do something JNIEnv env jobject thiz jobject p1 jobject p2 jclass c jfieldID
  • PHP:获取小数位数

    有没有一种直接的方法来确定 PHP 中整数 双精度值的小数位数 也就是说 不使用explode str 1 23444 print strlen substr strrchr str 1
  • JavaScript 中 && 简写的解释

    使用 jQuery 的水印插件 我尝试 jslint 并最小化函数 但我遇到了以前从未见过的语法 其中存在确实应该有赋值或函数调用的表达式 function fn watermark function css text return thi
  • Neo4j 2 Cypher 模糊搜索

    我正在使用 Neo4j 2 REST API 并且能够添加插件 我的数据库中有一个实体 其标签为 实体 名称为 英国 如何执行模糊搜索来查找该实体 我希望能够使用以下查询找到它 United Kingdom 英国 英国 So the
  • 如何禁用 Nuxt3 默认加载指示器?

    我已经查看文档和谷歌搜索很长时间了 由于某种原因 我似乎无法弄清楚如何禁用默认的 Nuxt3 加载指示器 有谁知道如何处理这个问题 当我刷新 路径上的页面时 它只会出现一瞬间 因此页面显示的是index vue页面 附上图片以供参考 尝试设
  • 如何使用与主脚本在同一文件中定义的 Moose 类?

    以下脚本p pl工作正常 use feature qw say use strict use warnings use lib use P1 my obj P1 gt new name gt John say The name is obj
  • Rmarkdown 中使用 apsrtable 的多个 lm() 模型表

    Goal 呈现使用创建的多个模型的结果lm 函数 一起放在一个格式良好的表格中 该表将在 Rmd 文件中生成并输出到 PDF 文档 建议的解决方案 In 使用 R 和 RStudio 进行可重复的研究 有一个例子使用apsrtable 并排
  • 为 java ejb Web 服务启用 https

    我正在使用 ejb 3 和 glassfish 3 1 1 开发一个网络服务 我正在使用 Netbeans 7 0 想知道如何为此 Web 服务在端口 8181 上启用 https 我不需要任何身份验证方法 只需通过 https 保护通信即
  • 使用 bootstrap 时模态不显示

    每当我按下按钮时 模式就不会显示 我尝试了很多事情 甚至创建了一个 custom js 来将此代码放入 myModal modal show 但就是不行 我哪里做错了 这是代码
  • 如何在 Inno Setup 中制作一个按钮或文本,单击时打开网页

    如何在 Inno Setup 安装程序中制作一个按钮或文本 单击时会打开一个网页 要打开网页 请使用 procedure OpenBrowser Url string var ErrorCode Integer begin ShellExe
  • 具有高级绘图函数的多个绘图,尤其是plot.rqs()

    我正在尝试并排绘制两个回归摘要和一个居中标题 每个回归摘要由以下方式生成plot rqs 总共有 9 个地块 我尝试过使用par mfrow c 1 2 已经 但正如我从 Paul Murrel 2006 的书中了解到的 高级函数如plot
  • 向 app.config 添加了新的应用程序设置,但 MSI 不会安装它(不会覆盖)

    我们最近向旧版 winforms 应用程序 Net 4 6 1 的 app config 日志服务器的 URL 添加了新的应用程序设置 不是用户设置 旧版本是 1 0 3 我们将所有程序集的版本更改为 1 0 4 并在安装项目 Visual