我们最近在旧版winforms应用程序(.Net 4.6.1)的app.config(日志服务器的URL)中添加了一个新的应用程序设置(非用户设置)。
旧版本是1.0.3,我们将所有程序集的版本更改为1.0.4并在安装项目(Visual Studio 2017安装程序项目)中将版本更改为匹配放弃弹出窗口以更改产品代码,我们做了。
安装正确运行(顺便更改其他内容,并且新版本中的更改正确),但我们新的app.config设置不是。奇怪的是,如果您手动删除配置文件并重新运行应用程序,它会重新创建配置文件,从而导致出现新设置。知道这里发生了什么吗?
谢谢!
答案 0 :(得分:1)
你可能没有使用WiX,但我会在我注意到你没有添加WiX作为标签之前添加我写的内容。得学会阅读。
这可能是MSI / WiX部署中最常见的问题,以及在主要升级期间消除了配置设置。我假设您在安装过程中将 app.config 文件设置为永久文件,以便在主要升级过程中保留它?
可能发生的事情是您已将配置文件安装为文件,但应将其安装为一组可以合并到目标文件中的XML配置设置。
The MSI file versioning rules尝试保留安装后已修改的非版本化文件。因此,如果升级时文件的创建和修改日期不同,则不会覆盖非版本化文件。如果没有最新的所需值,您的文件将保持不变。它已被“保留”。
您可以使用适当的WiX XML元素更新WiX源以设置所需的值。有两个相关的不同元素:
关于这两个元素之间的差异,我引用 Bob Arnson (WiX开发人员):“你可以做XmlFile支持XmlConfig的所有事情(以及更多),但它需要额外的使用XmlFile创作并不是必需的。 XmlFile最适合修改您正在安装的XML文件(例如,添加反映文件安装路径的属性);它无法在卸载时删除修改,但如果您的安装程序安装了该文件,则无论如何都会将其卸载。 XmlConfig最擅长修改共享XML文件,因为它支持卸载修改。“(source)。
我发现这些XML的东西非常繁琐,我可能不会使用最新最好的技术,但这里有一个快速的示例。彻底测试 - 特别是卸载和升级方案 - 我自己进行了有限的测试:
这是我的测试XML文件(实际安装为文件然后更新)。请检查您保存的文件的编码 - some issues with encoding have been reported - 不确定当前状态:
<?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>
我希望这有点道理。就像我说的那样,我发现这种情况有时很容易出错,但是这种更新的其他工具也是如此。请记住首先尝试使用原始测试用例并进行测试安装以测试运行时错误。做一些有用的小东西,然后在它上面构建 - 这显然是不言而喻的,但它很容易一次性尝试。 “在洞里开火,寻求掩护!”。
保管的一些链接: