安装时强制覆盖App.config文件

5
我们目前有四个安装程序用于我们的客户端软件:
- ClientSetupTest - ClientSetupProduction - ClientUpdateTest - ClientUpdateProduction
它们之间唯一的区别在于Setup包含Crystal Reports可分发文件,而Update则不包含。Test和Production只是指定它们运行的环境,其中唯一的区别是Client.exe.config文件中的一行。
我知道这很愚蠢,所以在删除Crystal Reports后,我用一个安装程序替换了它们所有。新的安装程序将所选环境写入setup.config,并由文件属性引用(请参见此处)。
"file"属性是新的配置文件,随着这个新的安装程序而来。我遇到的问题是,如果我们修改旧安装上的Client.exe.config文件,然后运行新的安装程序,则配置文件永远不会更新为"file"属性。
是否有任何方法强制更新文件?RemovePreviousVersions并不完全起作用,因为它是一个不同的安装程序,除非我理解错了什么。我的当前想法,可能会起作用,就是在OnBeforeInstall方法中添加代码来重命名旧的Client.exe.config为备份文件,这样它总是写入新的文件。不过看起来应该有更简单的解决方案在安装程序本身中。有什么想法吗?
编辑: 在调用base.OnBeforeInstall()之前将旧配置文件重命名为Client.exe.config.old并没有起作用。它重命名了文件,但没有写入新的文件。
1个回答

5

Windows Installer无法更新已修改的文件

非版本化文件是用户数据——如果计算机上文件的修改日期晚于创建日期,则不要安装该文件,因为用户自定义将被删除。如果修改日期和创建日期相同,则安装该文件。如果创建日期早于修改日期,则认为该文件未被修改,可以安装该文件。

您有几个选项:

  • 包含一个自定义操作,以原地修改文件。这可能是一个脚本或.NET代码。

  • 按照您的说法执行-将现有文件挪开。安装程序不会停留在它上面。但您需要确保它按照您想象的顺序发生。您可能需要使用Orca来确定顺序。

  • 包含一个自定义选项,将创建日期设置为“今天”。这应该使用脚本化的自定义操作非常简单,使用Scripting.FileSystemObject。然后Windows安装程序将覆盖它。


谢谢。我会尝试使用自定义选项。我仍然会遇到一个问题,就是无法保留他们的自定义设置,但如果已经被修改,我可以检测到并复制旧配置。 - Chris Doggett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接