在安装期间强制覆盖App.config

时间:2009-07-29 15:29:31

标签: c# configuration setup-project

我们目前有4个客户端软件安装程序:

  • ClientSetupTest
  • ClientSetupProduction
  • ClientUpdateTest
  • ClientUpdateProduction

它们之间的唯一区别是安装程序包含Crystal Reports可再发行文件,而Update不包含。测试和生产只是指定它们运行的​​环境,唯一的区别是Client.exe.config文件中有一行。

愚蠢,我知道,这就是为什么我在摆脱Crystal Reports后用一个安装程序替换它们的原因。新安装程序将所选环境写入setup.config,该文件由文件属性(see here)引用。

使用此新安装程序,“file”属性对配置文件是新的。我遇到的问题是,如果我们修改旧安装上的Client.exe.config文件,然后运行新的安装程序,配置文件永远不会使用“file”属性进行更新。

有没有办法强迫它更新文件? RemovePreviousVersions并不完全有效,因为它是一个不同的安装程序,除非我误解了一些东西。我当前的想法可能会起作用,就是在OnBeforeInstall方法中添加代码以将旧的Client.exe.config重命名为备份文件,因此它总是会编写新的。看起来安装程序本身应该有一个更简单的解决方案。有什么想法吗?

编辑:在调用base.OnBeforeInstall()之前将旧配置文件重命名为Client.exe.config.old不起作用。它重命名了该文件,但从未编写过新文件。

1 个答案:

答案 0 :(得分:4)

Windows Installer won't update a modified file

  

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

你有一些选择:

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

  • 按照你的说法做 - 将现有文件移开。安装程序不会停止。但是你需要确保它按照你想象的顺序发生。您可能需要Orca来确定排序。

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